使用 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 空的 "" 作为上下文路径。

由于第一个解决方案易于部署,我不知道 ValveFilter 是否实施了第二个解决方案。