我们正在尝试从URL中消除应用程序上下文,但它不起作用。Apache Web服务器位于运行Java应用程序的Tomcat服务器前面,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 ^(.*)$ $1;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()
返回正确的值。因此您:
>
要么将每个应用程序部署在它们自己的虚拟主机的根上下文中。这需要您将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
或Filter
来包装HttpServletRequest
并返回空的"
作为上下文路径。
由于第一个解决方案易于部署,我不知道任何实现第二个解决方案的Valve
或Filter
。