提问者:小点点

使用Apache HTTPD反向代理从URL中删除Tomcat应用程序上下文


我们正在尝试从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)。


共1个答案

匿名用户

“我们不想将应用程序上下文更改为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等。

    或者编写一个ValveFilter来包装HttpServletRequest并返回空的"作为上下文路径。

    由于第一个解决方案易于部署,我不知道任何实现第二个解决方案的ValveFilter