绝对 URL 不适用于 Apache2 AJP 代理 Tomcat

绝对 URL 不适用于 Apache2 AJP 代理 Tomcat

我似乎不知道如何正确配置 ReverseProxy。返回的 URL 全部针对根目录“/”,而不是“/tomcat”,并且只显示主“默认”tomcat 页面。我使用 Apache2 作为 Tomcat 的前端,并采用以下代理规则:

ProxyPass /tomcat ajp://127.0.0.1:8009/
ProxyPassReverse /tomcat ajp://127.0.0.1:8009/

我也尝试过在 Tomcat 的 AJP 连接器设置中使用 ProxyName。使用 mod_rewrite 代理 AJP 请求也得到了相同的结果。

Apache error.log 给出以下行(尝试从其自己的根目录加载图像):

File does not exist: /var/www/asf-logo-wide.gif, referer:

编辑:AJP 通过 mod_jk 工作,但在使用子文件夹时仍然会出现与 HTTP 相同的问题。

答案1

问题在于您的 tomcat 服务器在 HTML 中嵌入了它所知道的路径的链接。而不是代理服务器的路径。(从您的 *.gif 日志条目中获取此信息)

ProxyPassReverse 不会修改 HTML 中的链接。它只会修改 HTTP 标头。

为了使其正常工作,您需要在应用程序上下文中为 tomcat 配置适当的位置和路径。您可能还需要将 webapp.war 文件重命名为 ROOT.war,并将所有上下文配置更改为“/”。

答案2

您可以尝试这篇文章,其中解释了使用 ProxyPassReverse 的适当方法:

http://www.humboldt.co.uk/2009/02/the-mystery-of-proxypassreverse.html

答案3

由于您输出的是绝对 URL,因此存在多种常见情况:

使用mod_proxy_html

或者您可以使用RewriteEngine将 URL 重写//myapp/

RewriteEngine On
RewriteCond %{REQUEST_URI} ! ^/myapp/
RewriteRule ^/(.*)$ /myapp/$1

这是根据记忆得出的,因此,你可能需要通过以下方式自行验证mod_rewrite 文档。但我建议坚持使用,mod_proxy_html因为重写发送给客户端的链接比内部重写每个请求要简单得多。

答案4

如果您需要返回mod_proxy

<Location /tomcat>
    ProxyPass ajp://127.0.0.1:8009/tomcat
    ProxyPassReverse ajp://127.0.0.1:8009/tomcat
</Location>

相关内容