如何配置Apache ProxyPassReverse处理后端相对重定向?
解决Apache ProxyPassReverse下后端相对重定向失效的问题
嘿,这个问题我之前配置反向代理的时候也碰到过,咱们先把根源说清楚:Apache自带的ProxyPassReverse只会处理带后端主机名的绝对URL重定向(比如你说的Location: http://fake.backend.local/Signin),但如果后端返回的是/Signin这种根相对路径的重定向,它根本识别不出来这是需要替换的内容,所以浏览器就直接跳到前端域名的根路径去了,自然就少了/cat/前缀。
直接给解决方案,一步到位
咱们需要加个响应头重写的规则,专门处理这种根相对的Location头,具体操作如下:
先确认mod_headers模块已启用(这个模块是用来修改响应头的,默认可能没开):
a2enmod headers systemctl restart apache2修改你的代理配置块:
把下面的Header edit指令加到你原有的<Location>配置里就行(注意:原配置里的<Location /test/>应该改成<Location /cat/>,因为你实际访问的是/cat/路径,不然代理路径不匹配也会出问题):<Location /cat/> ProxyPass http://fake.backend.local/ ProxyPreserveHost Off ProxyPassReverse http://fake.backend.local/ # 关键新增:把后端返回的根相对路径重写成带/cat/前缀的路径 Header edit Location "^/(.*)$" "/cat/$1" # 你原来处理页面内链接的配置保留不变 SetOutputFilter INFLATE;proxy-html;DEFLATE ProxyHTMLURLMap / /cat/ ProxyHTMLURLMap fake.backend.local/ /cat/ ProxyHTMLDocType "<!DOCTYPE html>" </Location>
为啥这招管用?
- 这条
Header edit指令用正则匹配所有以/开头的Location值(就是后端返回的那些根相对重定向),把/Signin直接替换成/cat/Signin,/dashboard替换成/cat/dashboard,完美补上缺失的前缀。 - 至于后端返回的绝对URL重定向,
ProxyPassReverse会先把它转换成http://fake.frontend.com/cat/Signin,这个值开头是http://,不会被上面的正则匹配到,所以不会重复修改,两种重定向方式都能兼容。
最后再检查两个小细节
- 一定要确保
<Location>的路径和你前端实际访问的路径一致(比如你访问的是http://fake.frontend.com/cat/,那<Location>就必须是/cat/),原配置里的/test/大概率是笔误,得改过来。 - 重启Apache之后,分别测试未登录和已登录的情况,确认重定向都能正确跳到
/cat/Signin和/cat/dashboard就大功告成了。
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

