Apache2在对应用做反向代理的时候,如果应用的页面中引用的连接或者是资源的地址是相对地址的话,是没有问题的,当应用中引用的地址是绝对地址(比如:)或者是request.getContextPath()的话(比如,页面的一个资源的链接是:),就可能会遇到把这个绝对地址返回给前端的问题,而前端实际上是访问不到这个实际的地址的,这样就会导致资源无法加载
网上有人提出使用ProxyHtml来把生成的html页面中这样的地址给替换掉(原理应该是做字符串的替换)
但是,使用ProxyHtml同样会遇到两个问题
1.无法把所有的地址都给替换掉,比如,写在js里的地址就不能完全替换掉
2.替换了之后,会导致contentLength变化,客户端浏览器如果依靠contentLength来做判断的话,就不准了
更好的解决的方式,是把客户端请求的原始的主机头信息传过去,使用ProxyPreserveHost 指令
ProxyPreserveHost On
就相当于在nginx中的:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Destination $fixed_destination;
改完之后,重启一下apache,页面中引用的绝对地址和request.getContextPath()在返回到客户端的时候,就会变成正确的,客户端可以访问到的地址了。
关键字:apache ,反向代理,绝对路径,request.getContextPath(),ProxyHtml,ProxyPreserveHost