反向代理(Reverse Proxy)带来的主机名端口问题及解决

2009年11月1日 | 标签: ,

在许多实际项目中,应用服务会部署在内网中,通过Web服务器做逆向代理访问。这种部署一般没有问题,但有些情况下应用会才请求中获取主机名/IP,端口并用来生成返回页面中的URL。比如在J2EE应用中,应用会从Request中获取:
.getServerName()
.getServerPort()
.getRemoteAddr()

这时取得的主机名/IP是内网的,端口号也是内网应用服务器的端口号,这样生成的URL客户端是不能访问的,客户端需要Web服务器的主机名/IP及端口号。

其实大部分的应用服务及Web反向代理都考虑了这个问题,在Tomcat中,可以在Connector中设置proxyName及proxyPort属性。这样应用就能正确处理代理的请求。

比如:
proxyName="www.mycompany.com"
proxyPort="80"/>

(对应的mod_proxy设置:
ProxyPass /myapp http://localhost:8081/myapp
ProxyPassReverse /myapp http://localhost:8081/myapp )

mod_proxy也把原始请求信息放在HTTP Header来传送:
X-Forwarded-For :The IP address of the client.
X-Forwarded-Host : The original host requested by the client in the Host HTTP request header.
X-Forwarded-Server :The hostname of the proxy server.

最后,mod_proxy还有一个配置:ProxyPreserveHost
ProxyPreserveHost On 表示用原始请求中的Host Header用于代理请求中的Host Header。

相关文章:

  1. Setting up a reverse proxy configuration with SSL
  2. 用nginx做反向代理来访问防外链图片
  3. 灵活运用Apache反向代理
  4. Picasaweb的反向代理访问
  5. 反正代理的内容过滤变换
目前还没有任何评论.