核心是用%{X-Forwarded-For}i原样记录该头内容,如“203.0.113.45, 198.51.100.22, 172.16.0.10”,其可信性取决于上游代理规范设置及防伪造控制,需配合RequestHeader unset和mod_remoteip+%a获取经验证的真实IP。

要在 Apache 中记录 X-Forwarded-For 头,核心是用 %{X-Forwarded-For}i 在日志格式中引用该请求头。它不会自动解析或校验,只是原样写入日志字符串——比如 "203.0.113.45, 198.51.100.22, 172.16.0.10"。是否可信、是否含真实 IP,取决于上游代理是否规范设置,以及你是否做了防伪造控制。
添加 X-Forwarded-For 到日志格式
编辑 Apache 配置文件(如 /etc/httpd/conf/httpd.conf 或站点的 VirtualHost 段),定义或修改 LogFormat:
- 推荐保留代理 IP(
%h)和原始头内容(%{X-Forwarded-For}i)并存,便于链路排查:LogFormat "%h %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined_xff - 若只关注真实 IP 字符串(不解析),可精简为:
LogFormat "%{X-Forwarded-For}i %t \"%r\" %>s %b" xff_only - 大小写不敏感,但建议统一用
X-Forwarded-For(标准写法),避免拼写差异导致空值
确保 X-Forwarded-For 头实际存在且可信
Apache 不生成这个头,它必须由前端代理(Nginx、CDN、WAF)传入。常见问题不是配置错,而是头根本没来:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Nginx 前端需配置:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 主流 CDN(阿里云、腾讯云、Cloudflare)默认携带,且把用户真实 IP 放在最左侧
- 为防客户端伪造,建议在 Apache 开头加:
RequestHeader unset X-Forwarded-For early,清空所有客户端自设的该头 - 若日志中该字段显示为
-或空白,说明上游未传递,需先检查代理配置
想记录“真正可用”的原始客户端 IP?用 mod_remoteip + %a
%{X-Forwarded-For}i 只是记录字符串;若需一个经验证、可直接用于统计或限流的干净 IP,应启用 mod_remoteip:
- 确认模块已加载:
LoadModule remoteip_module modules/mod_remoteip.so - 指定你完全可控的代理网段(如内网 Nginx、K8s Ingress):
RemoteIPInternalProxy 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 - 声明解析头:
RemoteIPHeader X-Forwarded-For - 之后日志中用
%a替代%h,它会自动返回最左的非私有、可信 IP
验证与注意事项
配置完别急着重启,先做两件事:
- 执行
apachectl configtest确保语法无误 - 用
curl -H "X-Forwarded-For: 1.2.3.4" http://your-site/测试日志是否写入对应值(注意:此测试仅验证记录能力,不代表该值可信) - 记住:
%{X-Forwarded-For}i不能用于权限控制、登录限制等安全场景,它可被绕过;仅适合审计、地域分析、流量回溯 - 日志中该字段可能很长(多级代理叠加),留意磁盘空间和日志轮转策略

















