代码之家  ›  专栏  ›  技术社区  ›  sakra

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

  •  0
  • sakra  · 技术社区  · 15 年前

    我想使用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。 servlet\u名称 而Apache没有将它们映射到 .

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

    4 回复  |  直到 15 年前
        1
  •  0
  •   jnas    15 年前

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

    mod_proxy_html (Apache第三方模块),它将解析和重写内容,而不仅仅是作为mod\u代理的url和响应头。

        2
  •  0
  •   Steven D. Majewski    15 年前

    使用ajp:的ProxyPassReverse似乎不起作用,因为从重定向返回的头在位置中没有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
    

    this note ,或更复杂的 solution here 使用mod\u proxy\u html 用于重写网页中的网址以及。

        3
  •  0
  •   Community CDub    8 年前

    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 必须解决此问题,并用中指定的地址或IP替换传入请求中的主机标头 ProxyPass . 不幸的是,这似乎是 ProxyPreserveHost 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
    

    有人深入调查过吗?

        4
  •  0
  •   Sharique Abdullah    11 年前

    对我来说,这似乎引起了一些问题:

    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
    

    我不知道为什么,但就是这样。