proxyaddheaders仅控制是否自动添加x-forwarded-for、x-forwarded-host、x-forwarded-server三个固定头,不支持自定义头注入;透传真实ip等客户端信息须用mod_headers配合requestheader指令,并推荐加early修饰符确保生效。

ProxyAddHeaders 不是用来“透传客户端信息”的工具,它只是一个开关,只控制 Apache 是否自动添加三个固定头:X-Forwarded-For、X-Forwarded-Host 和 X-Forwarded-Server。想把真实 IP、地区、设备类型等自定义客户端信息传给后端,必须用 mod_headers 搭配 RequestHeader 指令。
ProxyAddHeaders 的真实作用
它不接收键值对,也不能设任意头。启用后仅做三件事:
-
X-Forwarded-For:追加原始客户端 IP(不是覆盖) -
X-Forwarded-Host:填入请求中的 Host 头(前提是ProxyPreserveHost Off) -
X-Forwarded-Server:填入 Apache 本机的 ServerName 或主机名
它默认是 On,一般无需显式配置;设为 Off 可禁用这三项,但不影响你用其他方式加头。
真正透传客户端信息的配置方法
确保以下模块已启用:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
mod_headers(必须) -
mod_proxy和mod_proxy_http(反向代理基础)
在 <virtualhost></virtualhost> 或对应 <location></location> 块中添加:
-
RequestHeader set X-Real-IP "%{REMOTE_ADDR}e"—— 最可靠的客户端 IP(避免被上游伪造) -
RequestHeader set X-Forwarded-Proto "https" env=HTTPS—— 仅 HTTPS 请求时设置协议 -
RequestHeader set X-Client-Country "cn" early—— 自定义静态值,early确保在 proxy 处理前注入 -
RequestHeader set X-User-Agent "%{HTTP:User-Agent}e" early—— 透传原始 UA(注意大小写匹配)
常见失效原因和应对
这些配置看似简单,但极易因细节出错而无效:
- 头没发出去:检查
RequestHeader是否写在ProxyPass所在的同一作用域(比如不能全局写,却只在某个 VirtualHost 里转发) - 取不到值:用
%{HTTP:xxx}e读请求头时,若该头已被 mod_proxy 修改过(如X-Forwarded-For),结果可能为空;优先用%{REMOTE_ADDR}e或%{SSL_CLIENT_S_DN}e这类环境变量 - 被覆盖或忽略:不加
early修饰符时,某些模块(如 mod_security、复杂 rewrite 规则)可能在之后重置头;关键字段建议统一加early - 模块未加载:错误日志出现
Invalid command 'RequestHeader',说明mod_headers没启用,需确认LoadModule headers_module modules/mod_headers.so
验证是否生效
最直接的方式是让后端返回所有收到的请求头(例如一个 Spring Boot 接口打印 request.getHeaderNames()),或在后端日志中输出 X-Real-IP、X-Client-Country 等字段。也可临时用 curl -v 查看 Apache 发往后端的原始请求(需开启 LogLevel debug 并查看 proxy:debug 日志)。










