最近我不得不使用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子目录。
答案 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/