使用 Apache HTTPD 反向代理从 URL 中删除 Tomcat 应用程序上下文
Removing Tomcat application context from URL using Apache HTTPD reverse proxy
我们正在尝试从 URL 中删除应用程序上下文,但它不起作用。 Apache Web 服务器面向 Tomcat 服务器 运行 Java 应用程序,Apache 虚拟主机如下所示:
<VirtualHost *:443>
ServerName my.domain.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/some.cer
SSLCertificateKeyFile /etc/ssl/certs/some.key
SSLCertificateChainFile /etc/ssl/certs/someother.cer
ProxyPreserveHost on
Header edit Set-Cookie ^(.*)$ ;Secure;SameSite=None
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) /app1/ [R=301]
ProxyPass /app1/ ajp://192.168.1.123:9101/app1/
ProxyPassReverse /app1/ ajp://192.168.1.123:9101/app1/
</VirtualHost>
多个应用程序通过 Tomcat Manager 部署,每个应用程序都有一个专用的子域。我们不想将应用程序上下文更改为 ROOT。
应该如何防止应用程序上下文出现在 URL 中?例如,我们想通过 my.domain.com 而不是 my.domain.com/app1 访问应用程序。从 ProxyPass/ProxyPassReverse 中删除路径没有帮助。
将 my.domain.com 重定向到 my.domain.com/app1 的重写模式解决方案不适用,因为目标是在任何情况下都防止上下文出现 (app1)。
“我们不想将应用程序上下文更改为 ROOT”:恐怕这就是您需要做的。要正确生成超链接,servlet 应用程序需要 HttpServletRequest#getContextPath()
到 return 的正确值。因此你:
要么将每个应用程序部署在它们自己的虚拟主机的根上下文中。这需要您更改 server.xml
文件以包含:
<Engine name="Catalina" defaultHost="app1.example.com">
<Host name="app1.example.com" appBase="webapps/app1.example.com">
...
</Host>
<Host name="app2.example.com" appBase="webapps/app2.example.com">
...
</Host>
</Engine>
并将第一个应用程序部署为 webapps/app1.example.com/ROOT.war
,等等
或者写一个 Valve
or Filter
来包装 HttpServletRequest
和 returns 空的 ""
作为上下文路径。
由于第一个解决方案易于部署,我不知道 Valve
或 Filter
是否实施了第二个解决方案。
我们正在尝试从 URL 中删除应用程序上下文,但它不起作用。 Apache Web 服务器面向 Tomcat 服务器 运行 Java 应用程序,Apache 虚拟主机如下所示:
<VirtualHost *:443>
ServerName my.domain.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/some.cer
SSLCertificateKeyFile /etc/ssl/certs/some.key
SSLCertificateChainFile /etc/ssl/certs/someother.cer
ProxyPreserveHost on
Header edit Set-Cookie ^(.*)$ ;Secure;SameSite=None
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) /app1/ [R=301]
ProxyPass /app1/ ajp://192.168.1.123:9101/app1/
ProxyPassReverse /app1/ ajp://192.168.1.123:9101/app1/
</VirtualHost>
多个应用程序通过 Tomcat Manager 部署,每个应用程序都有一个专用的子域。我们不想将应用程序上下文更改为 ROOT。
应该如何防止应用程序上下文出现在 URL 中?例如,我们想通过 my.domain.com 而不是 my.domain.com/app1 访问应用程序。从 ProxyPass/ProxyPassReverse 中删除路径没有帮助。
将 my.domain.com 重定向到 my.domain.com/app1 的重写模式解决方案不适用,因为目标是在任何情况下都防止上下文出现 (app1)。
“我们不想将应用程序上下文更改为 ROOT”:恐怕这就是您需要做的。要正确生成超链接,servlet 应用程序需要 HttpServletRequest#getContextPath()
到 return 的正确值。因此你:
要么将每个应用程序部署在它们自己的虚拟主机的根上下文中。这需要您更改
server.xml
文件以包含:<Engine name="Catalina" defaultHost="app1.example.com"> <Host name="app1.example.com" appBase="webapps/app1.example.com"> ... </Host> <Host name="app2.example.com" appBase="webapps/app2.example.com"> ... </Host> </Engine>
并将第一个应用程序部署为
webapps/app1.example.com/ROOT.war
,等等或者写一个
Valve
orFilter
来包装HttpServletRequest
和 returns 空的""
作为上下文路径。
由于第一个解决方案易于部署,我不知道 Valve
或 Filter
是否实施了第二个解决方案。