Apache反向代理到8080端口的tomcat应用程序在响应头中给出错误的URL

我有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是由后端生成的
  • Apache检查任何ProxyPassReverse xxx http://ext-domain:8080/app
  • 如果匹配,Apache继续HTTP 302 xxx/foo这一步不会发生在你的情况下
  • 如果xxx不是一个完整的URL,那么就会使用通常的ServerName和类似的扩展(所以ProxyPassReverse /app42 ...的完整意义就是让Apache来说302 http://ext-domain/app42
  • Apache也知道浏览器与Apache的80端口对话,所以它不会误导浏览器到8080,除非你明确告诉它错误地configuration了ServerName

我有类似的情况,但有一个不同的反向代理configuration。

 ServerName ext-domain ProxyPreserveHost On ProxyPass / http://int-ip:8080/ ProxyPassReverse / http://ext-domain/ 

我仍然得到302和浏览器被redirect到http:// ext-domain:8080 / 。 这里缺less什么? 我正在使用这个对付mmonit服务。