我有Apache(2.2)服务器与以下configuration反向代理到应用程序运行在8080端口上的tomcat(6)。
.... ServerName ext-domain ProxyPreserveHost On ProxyPass /myapp http://int-domain:8080/myapp ProxyPassReverse /myapp http://int-domain:8080/myapp ....
当我从浏览器访问URL下面
"http://ext-domain/myapp"
我在浏览器地址栏中获取下面的URLreplace。
"http://ext-domain:8080/myapp"
和Apache访问日志说…
"GET /myapp HTTP/1.1" 302 421 "-" "Mozilla/5.0"...
如何避免在端口8080插入响应URL?
有人可以帮助吗? 谢谢。
更新ProxyPassReverse如下。
ProxyPassReverse /myapp http://ext-domain/myapp
请参阅: http : //httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html#usage
好的,旧的答案是不完整的。 罪魁祸首是:ProxyPreserveHost上 。 你几乎不需要这个条款。
因此,初始configuration模板应该是:
.... ServerName ext-domain ProxyPass /app http://int-domain:8080/myapp ProxyPassReverse /app http://int-domain:8080/myapp ....
让你吃惊的302响应是由后端生成的 。 你已经告诉后端报头Host: ext-domain ,这是ProxyPreserveHost的效果,所以后端想要很好听话,如果需要给你302redirect,它也使用相同的ext-domain作为方便你。 Backed知道你连接的是哪个端口,所以它试图使用相同的端口来方便你。 如果这不是一个方便的话,那么首先不要使用ProxyPreserveHost ,这是解决问题的最干净和最不容易解决的问题。 大多数应用程序(不是全部)不需要ProxyPreserveHost ,但使用通常的X-Forwaded-xxx标头。
302的处理大致是这样的:
HTTP 302 http://ext-domain:8080/app/foo是由后端生成的 ProxyPassReverse xxx http://ext-domain:8080/app HTTP 302 xxx/foo ( 这一步不会发生在你的情况下 ) ServerName和类似的扩展(所以ProxyPassReverse /app42 ...的完整意义就是让Apache来说302 http://ext-domain/app42 ) ServerName 。 我有类似的情况,但有一个不同的反向代理configuration。
ServerName ext-domain ProxyPreserveHost On ProxyPass / http://int-ip:8080/ ProxyPassReverse / http://ext-domain/
我仍然得到302和浏览器被redirect到http:// ext-domain:8080 / 。 这里缺less什么? 我正在使用这个对付mmonit服务。