Apache2在对应用做反向代理的时候,如果应用的页面中引用的连接或者是资源的地址是相对地址的话,是没有问题的,当应用中引用的地址是绝对地址(比如:)或者是request.getContextPath()的话(比如,页面的一个资源的链接是:apache反向代解决绝对路径可能出现的问题-LMLPHP),就可能会遇到把这个绝对地址返回给前端的问题,而前端实际上是访问不到这个实际的地址的,这样就会导致资源无法加载

网上有人提出使用ProxyHtml来把生成的html页面中这样的地址给替换掉(原理应该是做字符串的替换)

但是,使用ProxyHtml同样会遇到两个问题

1.无法把所有的地址都给替换掉,比如,写在js里的地址就不能完全替换掉

2.替换了之后,会导致contentLength变化,客户端浏览器如果依靠contentLength来做判断的话,就不准了

更好的解决的方式,是把客户端请求的原始的主机头信息传过去,使用ProxyPreserveHost 指令

apache反向代解决绝对路径可能出现的问题-LMLPHP

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

05-11 17:10