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

时间:2010-02-10 12:10:03

标签: 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://192.168.1.30:8009/servlet_name
</IfModule>

请注意,external_nameservlet_name不同。

Tomcat 6配置:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

然而,这不起作用。 Apache似乎将http请求转发给Tomcat。 但是,Tomcat返回的URL和重定向仍使用原始servlet_name,Apache不会将它们映射到external_name

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

4 个答案:

答案 0 :(得分:0)

在Apache和Tomcat之间映射不同的名称可能非常棘手,并且很大程度上取决于Web应用程序如何为响应构建其URL。

基本上你的设置是正确的,但是如果你的应用程序使用自己的servlet_name进行重定向和url,则ProxyPassReverse不会映射它们。

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

答案 1 :(得分:0)

(一个迟到的答案,但我自己也遇到了这个问题。)

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

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

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

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

使用mod_proxy_html查看this note或更具参与性的solution here 用于重写网页中的URL。

答案 2 :(得分:0)

除了answer from Steven D. Majewski之外,还有一个问题。如果目标应用程序使用请求主机名创建重定向(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 on必须解决此问题,并使用ProxyPass中指定的地址或IP替换传入请求中的HOST标头。不幸的是,似乎ProxyPreserveHost无法与ajp连接器一起使用。我配置中的tomcat仍然收到从浏览器获取的主机名,而不是用192.168.1.30替换它。因此,基于浏览器的重定向仍然不适用于每个名称。

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

# NOT WORKING !!!
ProxyPassReverse /external_name http://%{HTTP_HOST}/servlet_name 

解决方法是使用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

有人深入调查了吗?

答案 3 :(得分:0)

对我来说,这似乎会引起问题:

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

我不知道为什么,但它只是做了。