ProxyPassReverse 用于修正后端响应头中的 Location、Content-Location 和 URI,将内网地址替换为用户访问的公网地址;必须与 ProxyPass 同在 内且路径与目标地址严格一致,不支持全局或 .htaccess 配置。

ProxyPassReverse 的作用不是“重写虚拟主机名”,而是修正后端返回的 Location、Content-Location 和 URI 这三个响应头里的 URL 地址,把内网地址(如 http://127.0.0.1:8080/login)替换成用户实际访问的公网地址(如 https://app.example.com/login)。它必须和 ProxyPass 在同一个 <virtualhost></virtualhost> 块里配,且路径与目标地址要严格一致。
必须放在 块内,不能单独存在
Apache 不允许在全局上下文或 .htaccess 中使用 ProxyPassReverse。它只在虚拟主机作用域生效,因为跳转修正依赖于当前请求的 Host、协议和端口信息。如果你把它写在 <virtualhost></virtualhost> 外面,指令会被忽略,302 跳转会直接暴露后端地址。
- ✅ 正确:所有代理相关指令(
ProxyPass、ProxyPassReverse、ProxyPreserveHost)都放在同一<virtualhost></virtualhost>内 - ❌ 错误:把
ProxyPassReverse写在<ifmodule proxy_http_module></ifmodule>或主配置顶层,它不会生效
路径和目标地址必须完全匹配 ProxyPass
ProxyPassReverse 不是智能替换,它是按字符串前缀做精确匹配。后端返回什么格式的 URL,你就得配什么格式的目标地址。
- 如果
ProxyPass /admin/ http://127.0.0.1:8080/,那么ProxyPassReverse必须写成/admin/ http://127.0.0.1:8080/(两端都有末尾斜杠) - 后端返回
Location: https://127.0.0.1:8080/callback?那你要配https://127.0.0.1:8080/,不能写http://或漏掉端口 - HTTPS 站点下,建议后端统一用相对路径跳转(如
/login),这样根本不需要 ProxyPassReverse 参与
配合 ProxyPreserveHost 和 X-Forwarded 头防二次偏移
仅靠 ProxyPassReverse 不够。有些后端(比如 Spring Boot、Tomcat)会根据收到的 Host 头生成跳转链接。如果 Apache 不透传原始 Host,后端可能拼出 http://localhost:8080/home 这类地址,而 ProxyPassReverse 又没配这个格式,就会失效。
- 加上
ProxyPreserveHost On,让客户端请求里的 Host(如app.example.com)原样传给后端 - HTTPS 场景下加
RequestHeader set X-Forwarded-Proto "https",告诉后端当前是 HTTPS 协议 - 后端应用需启用对
X-Forwarded-*头的支持(例如 Spring Boot 配置server.forward-headers-strategy=framework)
多个域名对应不同后端时,每个都要独立配
不能共用一条 ProxyPassReverse。每个 <virtualhost></virtualhost> 是隔离的,各自负责自己的域名和后端。
-
admin.example.com → http://127.0.0.1:8080/:在它的<virtualhost></virtualhost>里配ProxyPass / http://127.0.0.1:8080/和ProxyPassReverse / http://127.0.0.1:8080/ -
api.example.com → http://127.0.0.1:8081/:在另一个<virtualhost></virtualhost>里配对应的ProxyPass和ProxyPassReverse - 少配一个,对应服务的 302 就会跳到内网地址,用户打不开


















