使用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_name
和servlet_name
不同。
Tomcat 6配置:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
然而,这不起作用。 Apache似乎将http请求转发给Tomcat。
但是,Tomcat返回的URL和重定向仍使用原始servlet_name
,Apache不会将它们映射到external_name
。
这对AJP来说有可能吗?如果不是,可以使用普通的http代理来完成吗?
答案 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
我不知道为什么,但它只是做了。