proxypass 仅负责路径转发,不处理请求头;真正控制请求头的是 proxypreservehost(透传 host)、requestheader(设置请求头)和 header(修改响应头)。

Apache 中 ProxyPass 本身不处理请求头的修改或添加,它只负责路径转发。真正控制请求头的是 RequestHeader、ProxyPreserveHost 和 Header 指令。三者分工明确:
-
ProxyPreserveHost on→ 透传原始 Host 头(最关键) -
RequestHeader→ 设置/覆盖/删除自定义请求头(如X-Real-IP、X-Original-Host) -
Header→ 修改响应头(如Access-Control-Allow-Origin)
下面分场景说明怎么写:
✅ 透传真实域名(Host 头)必须用 ProxyPreserveHost
后端要识别用户访问的是 api.example.com 而不是 127.0.0.1:8080,不能靠 RequestHeader “伪造”,而必须启用:
ProxyPreserveHost on ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/
这个指令必须和 ProxyPass 在同一个 <virtualhost></virtualhost> 块内,且不能写在 .htaccess 或全局配置外。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
✅ 补充自定义请求头(比如记录原始 Host)才用 RequestHeader
如果后端还需一个额外字段(如 X-Original-Host),可这样写:
RequestHeader set X-Original-Host "%{HTTP_HOST}e" early
-
%{HTTP_HOST}e是 Apache 解析后的原始 Host 值(等同于请求头里的Host) -
early表示在代理模块执行前注入,避免被后续逻辑覆盖 - 注意:这不是必需操作,只是冗余备份
✅ 传递客户端真实 IP 需配合 X-Forwarded-* 头
默认后端看到的源 IP 是 Apache 本机地址。要让后端拿到真实 IP,需主动加头:
ProxyPreserveHost on
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e" early
RequestHeader set X-Forwarded-Proto "https" early
RequestHeader set X-Forwarded-Host "%{HTTP_HOST}e" early
后端框架(如 Spring Boot、Express)会自动读取这些标准头还原原始请求信息。
⚠️ 常见错误写法(别这么干)
- ❌
RequestHeader set Host "%{HTTP_HOST}e"—— Host 头是受保护的,Apache 不允许直接覆盖,会报错或静默失败 - ❌ 把
RequestHeader写在ProxyPass之后又没加early—— 可能被代理模块丢弃 - ❌ 忘记启用
mod_headers模块 ——RequestHeader和Header指令将完全无效
不复杂但容易忽略










