Apache反向代理无尾斜路径请求时Location重定向缺失path前缀问题
问题根因
你开启了ProxyPreserveHost On配置后,内网Apache收到的请求Host头为www.example.com,触发301重定向时生成的Location头直接使用该Host,最终返回的重定向地址为http://www.example.com/subpath/。而你原本配置的ProxyPassReverse规则仅会对前缀为http://xxx.xxx.xxx.xxx:pppp/的Location头做路径替换,对前端域名开头的重定向地址不会做任何处理,因此丢失了/path前缀。
可用解决方案
方案1:前端提前补全尾部斜杠(推荐,性能最优)
在现有代理配置前增加重写规则,所有访问/path前缀且无尾部斜杠的请求,前端直接返回301补全斜杠,避免触发内网服务的重定向逻辑:
# 若未启用重写模块,先在命令行执行 a2enmod rewrite RewriteEngine On # 匹配/path无斜杠的根请求 RewriteRule ^/path$ /path/ [L,R=301] # 匹配/path下所有无斜杠且无后缀的子路径请求 RewriteRule ^/path/([^/.]+)$ /path/$1/ [L,R=301] # 原有代理配置保持不变 ProxyPreserveHost On ProxyPass "/path/" "http://xxx.xxx.xxx.xxx:pppp/" ProxyPassReverse "/path/" "http://xxx.xxx.xxx.xxx:pppp/"
方案2:新增ProxyPassReverse规则适配前端域名重定向
不需要修改重写规则,直接新增一条ProxyPassReverse配置,匹配内网返回的带前端域名的重定向地址,自动补全/path前缀:
ProxyPreserveHost On ProxyPass "/path/" "http://xxx.xxx.xxx.xxx:pppp/" ProxyPassReverse "/path/" "http://xxx.xxx.xxx.xxx:pppp/" # 新增以下配置即可 ProxyPassReverse "/path/" "http://www.example.com/"
方案3:调整内网服务部署路径
最彻底的方案是将内网的服务也部署在/path路径下,而非根路径,这样内网服务生成的重定向地址本身就会携带/path前缀,无需额外调整前端代理配置。
内容的提问来源于stack exchange,提问作者Guido
相关产品推荐
相关产品推荐

