反向代理(Reverse Proxy)带来的主机名端口问题及解决
在许多实际项目中,应用服务会部署在内网中,通过Web服务器做逆向代理访问。这种部署一般没有问题,但有些情况下应用会才请求中获取主机名/IP,端口并用来生成返回页面中的URL。比如在J2EE应用中,应用会从Request中获取:
.getServerName()
.getServerPort()
.getRemoteAddr()
这时取得的主机名/IP是内网的,端口号也是内网应用服务器的端口号,这样生成的URL客户端是不能访问的,客户端需要Web服务器的主机名/IP及端口号。
其实大部分的应用服务及Web反向代理都考虑了这个问题,在Tomcat中,可以在Connector中设置proxyName及proxyPort属性。这样应用就能正确处理代理的请求。
比如:
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。
相关文章:
