2010-02-10 77 views
0

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

的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代理来完成吗?

回答

0

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

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

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

0

(A迟到的回答,但我只是碰到了这个问题我自己。)

看来,ProxyPassReverse使用AJP:不工作,因为头从重定向返回没有一个AJP:URL中位置:,他们有一个http:URL。 ProxyPassReverse只会导致重写匹配头文件,并且 该字符串与返回的内容不匹配。

这应该工作(提供的地点:现场使用该数字地址 而不是主机名)。

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

(您可以使用“卷曲-I”来检查重定向报头和调试。)

请参阅this note或更多参与solution here使用mod_proxy_html 重写网页中的网址。

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 

难道有人研究它深深?

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 

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

+0

他们是一样还是我错过了什么? – 2014-01-22 08:57:33

+0

不同,第二个ProxyPassReverse声明具有以AJP开头的URL,而不是第一个URL。 – 2014-01-23 10:05:14

相关问题