Apache日志中引用X-Forwarded-For可记录真实IP,但不改变%h或REMOTE_ADDR;需上游代理正确设置该头,配置LogFormat添加%{X-FORWARDED-FOR}i,并在可信环境下配合mod_remoteip使用。

直接在 Apache 的日志格式中引用 X-Forwarded-For 头部即可记录真实客户端 IP,但要注意:它只是“记录”,不改变 %h 的值,也不影响 PHP 或应用层获取的 REMOTE_ADDR。关键在于日志配置是否正确、头部是否存在、以及是否可信。
确认 X-Forwarded-For 已由前端正确传递
Apache 本身不会生成 X-Forwarded-For,它必须由上游代理(如 Nginx、CDN、WAF)主动设置。常见正确写法:
- Nginx 配置中需包含:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 腾讯云 CDN、阿里云 CDN、Cloudflare 等默认都会携带该头,且首个 IP 即为用户真实 IP
- 若日志中
%{X-Forwarded-For}i显示为空或-,说明前端未传该头,需先检查并修复代理配置
修改 LogFormat,加入 X-Forwarded-For 字段
编辑 httpd.conf 或站点配置文件,在 LogFormat 指令中插入 %{X-Forwarded-For}i。注意大小写不敏感,但推荐全大写保持一致性:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 替换默认
combined格式(推荐):
- 如果只关心真实 IP,也可精简为:
LogFormat "%{X-FORWARDED-FOR}i %l %u %t \"%r\" %>s %b" realip,再用CustomLog logs/access_real.log realip -
%h仍保留代理 IP,便于排查链路;%{X-FORWARDED-FOR}i显示完整头内容(如203.123.45.67, 10.1.2.3)
区分“记录”与“覆盖 REMOTE_ADDR”
仅靠 %{X-FORWARDED-FOR}i 写入日志,不会让 PHP 的 $_SERVER['REMOTE_ADDR'] 变成真实 IP——那需要 mod_remoteip 模块干预网络层:
- 若你只需日志分析(如统计地域、导出访客 IP),当前配置已足够
- 若应用代码(如 PHP/Python)也需读取真实 IP,必须启用
mod_remoteip并配置RemoteIPHeader和RemoteIPInternalProxy - 否则,仅改日志会导致日志里有真实 IP,但
phpinfo()或print_r($_SERVER)里仍是代理 IP
验证与注意事项
重启 Apache 后,用 curl -H "X-Forwarded-For: 192.168.1.100" http://your-site/ 测试日志是否生效。观察 access_log 输出:
- 成功示例:
10.0.1.5 192.168.1.100 - - [01/May/2026:21:21:00 +0800] "GET / HTTP/1.1" 200 1234 ... - 若显示多个 IP(如
203.123.45.67, 118.89.171.94),说明经过多级代理,首个即用户真实 IP - 切勿在不可信网络中直接信任该头——攻击者可伪造
X-Forwarded-For,生产环境务必配合RemoteIPInternalProxy白名单机制

















