mod_proxy_ajp和Location标头

时间:2010-06-29 12:57:56

标签: tomcat6 mod-proxy

最近我不得不使用Tomcat6为客户端安装Java应用程序。应用程序需要从其域的根目录运行,因此我还安装了apache2和mod_proxy_ajp来设置代理以使其工作。经过一些按摩和谷歌搜索来处理位置标头,包括servlet的原始路径而不是代理根。我想出了这个。

<VirtualHost *:80>
        ServerName myclientssite.com
        ErrorLog /var/log/apache2/ajp.error.log
        CustomLog /var/log/apache2/ajp.log combined

        <Proxy *>
                AddDefaultCharset Off
                Order deny,allow
                Allow from all
        </Proxy>

        ProxyRequests Off
        ProxyPass / ajp://localhost:8009/appname/
        ProxyPassReverse / http://localhost:8080/appname/
        ProxyPassReverseCookiePath /appname/ /

        Header edit Location ^([^/]*//[^/]*)?/appname/(.*)$ $1/$2
</VirtualHost>

我的问题是这是最好的解决方案。似乎没有mod_headers,Header编辑行和标题通常包含appname子目录。

1 个答案:

答案 0 :(得分:0)

Java应用程序是否根据请求中的信息(而不是某些显式配置)构建其Location标头?在这种情况下,如果您使用ProxyPreserveHost On,则应该获得正确的位置。

如果您的Apache Httpd前端是通过HTTPS并且从Apache Httpd到Java容器的连接是通过普通的HTTP或AJP,那么您需要更改标头的情况。理论上(在实践中可能并非总是如此),Location header requires an absolute URI并非如此,因此如果您已经知道主机名,则可能不需要这样复杂的表达式。

我还建议使用HTTP反向代理而不是AJP(最后它非常相似,但似乎有更多的支持)。

ProxyRequests Off
ProxyPass /appname/ http://localhost:8080/appname/
ProxyPassReverse /appname/ http://localhost:8080/appname/
ProxyPreserveHost On

# If you're using HTTPS
Header edit Location ^http://www.example/appname/ https://www.example/appname/