Apache虚拟主机需通过可信CDN出口IP链路获取真实客户端IP,配置RemoteIPInternalProxy和RemoteIPHeader,并用RequestHeader unset清除伪造头,最终使REMOTE_ADDR和%a显示真实IP。

Apache 虚拟主机要从特定 CDN 获取真实客户端 IP,核心不是“读取 X-Forwarded-For 的第一个值”,而是建立可信链路——只信任该 CDN 的出口 IP,并让 Apache 自动剥离伪造或中间代理干扰,最终把验证后的源 IP 写入 REMOTE_ADDR 和日志中的 %a。
确认并填写 CDN 的可信出口 IP 段
不同 CDN 的出口 IP 范围不同,必须查官方文档(如 Cloudflare、阿里云 CDN、腾讯云 CDN 或百度云加速),不能凭经验填。例如:
- Cloudflare:提供完整 IPv4/IPv6 CIDR 列表,需全部加入
RemoteIPInternalProxy - 阿里云全站加速:控制台可导出当前生效的回源 IP 段(通常是多个 /24 或 /22)
- 自建 Nginx 做前置代理:填你 Nginx 所在服务器的真实内网 IP 或 Docker 网关(如
172.17.0.1)
配置示例(放在虚拟主机块内):
RemoteIPInternalProxy 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22 141.101.64.0/18 162.158.0.0/15 172.64.0.0/13 188.114.96.0/20 190.93.240.0/20 197.234.240.0/22 198.41.128.0/17 2400:cb00::/32 2606:4700::/32 2803:f800::/32 2405:b500::/32 2405:3400::/32
指定 CDN 使用的转发头字段
大多数 CDN 默认用 X-Forwarded-For,但部分(如某些私有 CDN 或定制网关)可能用 X-Real-IP 或 X-Forwarded-For-Original。务必确认 CDN 实际设置的 header 名称:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 若 CDN 发送
X-Forwarded-For: 203.0.113.45, 198.51.100.22→ 配置RemoteIPHeader X-Forwarded-For - 若 CDN 只发
X-Real-IP: 203.0.113.45→ 改为RemoteIPHeader X-Real-IP - 不建议混用;一个虚拟主机只信任一种头,避免冲突
禁用客户端伪造头,只认 CDN 添加的值
用户浏览器可随意发送 X-Forwarded-For,必须在请求进入 Apache 第一时刻清除它,防止污染:
RequestHeader unset X-Forwarded-For early
这条指令必须放在虚拟主机最顶部(或全局配置开头),确保所有后续模块(包括 mod_remoteip)看到的是 CDN 真实添加的头,而非客户端提交的假值。
验证配置是否生效
重启 Apache 后,可通过以下方式快速验证:
- 在 PHP 中打印:
echo $_SERVER['REMOTE_ADDR'];—— 应显示真实公网 IP,不再是 CDN 节点 IP - 自定义日志格式:
LogFormat "%h %a %u %t \"%r\" %>s" debug_log,其中%a即为 mod_remoteip 解析后的可信 IP - 检查错误日志:
tail -f /var/log/httpd/error_log,若出现RemoteIP: unable to parse X-Forwarded-For,说明头格式异常或未被信任代理发送

















