Apache 将内部servlet名称映射到不同外部名称的AJP代理

Apache 将内部servlet名称映射到不同外部名称的AJP代理,apache,tomcat,ajp,Apache,Tomcat,Ajp,我想使用apache2为Tomcat服务器设置一个AJP代理,该服务器将内部servlet URL映射到外部完全不同的URL。目前我正在使用以下配置: Apache2配置: <IfModule mod_proxy.c> ProxyPreserveHost on ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name ProxyPassReverse /external_name ajp://1

我想使用apache2为Tomcat服务器设置一个AJP代理,该服务器将内部servlet URL映射到外部完全不同的URL。目前我正在使用以下配置:

Apache2配置:

<IfModule mod_proxy.c>
    ProxyPreserveHost on
    ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name
    ProxyPassReverse /external_name ajp://192.168.1.30:8009/servlet_name
</IfModule>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
然而,这是行不通的。Apache似乎将http请求转发给Tomcat。 但是,Tomcat返回的URL和重定向仍然使用原始的
servlet\u名称
,Apache没有将它们映射到
external\u名称


这对AJP来说可能吗?如果不是,可以使用普通的http代理吗?

在Apache和Tomcat之间映射不同的名称可能会非常棘手,这在很大程度上取决于web应用程序为响应构建URL的方式

基本上,您的设置是正确的,但如果应用程序使用自己的servlet_名称进行重定向和URL,ProxyPassReverse将不会映射它们

如果您需要这种设置,请查看(Apache第三方模块),它将解析和重写内容,而不仅仅是作为mod_代理的url和响应头。

(回答很晚,但我自己也遇到了这个问题。)

使用ajp:的ProxyPassReverse似乎不起作用,因为从重定向返回的头在位置中没有ajp:URL,它们有一个http:URL。ProxyPassReverse只会导致重写匹配的头,并且 该字符串与返回的内容不匹配

这应该有效(前提是Location:字段使用该数字地址) 而不是主机名。)

(您可以使用'curl-I'检查重定向头并进行调试。)

请参阅,或更复杂的使用mod_proxy_html 用于重写网页中的URL

除此之外,还有一个问题。如果目标应用程序使用请求主机名创建重定向(302临时移动),则无法使用多个主机名。必须为每个名称创建多个配置,如下所示:

ProxyPassReverse /external_name http://server.com/servlet_name
ProxyPassReverse /external_name http://server.org/servlet_name
ProxyPassReverse /external_name http://server.co.uk/servlet_name
实际上,上的
ProxyPreserveHost必须解决此问题,并用
ProxyPass
中指定的地址或IP替换传入请求中的主机头。不幸的是,
ProxyPreserveHost
似乎不适用于ajp连接器。在我的配置中,tomcat仍然收到从浏览器获得的主机名,而不是将其替换为
192.168.1.30
。因此,基于浏览器的重定向仍然不能适用于每个名称

以下配置也不起作用:-(

解决方法是使用http而不是ajp

ProxyPreserveHost on
ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name
ProxyPassReverse /external_name http://192.168.1.30/servlet_name

有人对此进行了深入调查吗?

对我来说,这似乎造成了一些问题:

ProxyPreserveHost on
ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name
ProxyPassReverse /external_name http://192.168.1.30/servlet_name
虽然这似乎奏效了:

ProxyPreserveHost on
ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name
ProxyPassReverse /external_name ajp://192.168.1.30:8009/servlet_name

我不知道为什么,但它确实如此。

它们是相同的还是我遗漏了什么?不同的是,第二个ProxyPassReverse声明的URL以AJP开头,而不是第一个声明中的HTTP。
ProxyPreserveHost on
ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name
ProxyPassReverse /external_name http://192.168.1.30/servlet_name
ProxyPreserveHost on
ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name
ProxyPassReverse /external_name ajp://192.168.1.30:8009/servlet_name