正确答案是:ServerName与真实IP获取无关,关键在三步闭环——CDN透传X-Forwarded-For头、Apache用mod_remoteip配置RemoteIPInternalProxy信任CDN出口IP段、日志和PHP用%a及$_SERVER['REMOTE_ADDR']读取修正后IP。

ServerName 本身不参与真实 IP 的获取逻辑,它只是 Apache 用于虚拟主机匹配的标识符(比如 ServerName example.com),和客户端 IP 传递完全无关。很多人误以为改 ServerName 能影响 IP 获取,其实这是一个常见误解。
真正决定能否拿到 CDN 后真实 IP 的,是 请求头处理 + 信任代理配置 + 日志或后端取值逻辑,而不是 ServerName。
✅ 正确思路:三步闭环配置
1. 确保 CDN 正确传递 X-Forwarded-For 头
主流 CDN(Cloudflare、阿里云、腾讯云、百度云等)默认会在请求中添加该头,且最左侧 IP 是用户真实 IP。
验证方式(在 PHP 或日志中打印):
echo $_SERVER['HTTP_X_FORWARDED_FOR'] ?? '未收到';
若为空,需检查 CDN 控制台是否开启「传递客户端真实 IP」选项(部分 CDN 默认关闭或需手动启用)。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
2. 告诉 Apache:哪些 IP 是可信代理(即 CDN 节点)
Apache 必须知道哪些来源的 X-Forwarded-For 是可信的,否则无法安全替换 REMOTE_ADDR。
使用 mod_remoteip 模块(Apache 2.4+ 推荐):
LoadModule remoteip_module modules/mod_remoteip.so # 指定用于传递真实 IP 的请求头 RemoteIPHeader X-Forwarded-For # 列出你所用 CDN 的官方 IP 段(务必查最新文档) # Cloudflare 示例(2026年有效段): RemoteIPInternalProxy 173.245.48.0/20 RemoteIPInternalProxy 103.21.244.0/22 RemoteIPInternalProxy 103.22.200.0/22 RemoteIPInternalProxy 103.31.4.0/22 RemoteIPInternalProxy 141.101.64.0/18 RemoteIPInternalProxy 108.162.192.0/18 RemoteIPInternalProxy 190.93.240.0/20 RemoteIPInternalProxy 188.114.96.0/20 RemoteIPInternalProxy 197.234.240.0/22 RemoteIPInternalProxy 198.41.128.0/17 RemoteIPInternalProxy 2400:cb00::/32 RemoteIPInternalProxy 2606:4700::/32 RemoteIPInternalProxy 2803:f800::/32 RemoteIPInternalProxy 2405:b500::/32 RemoteIPInternalProxy 2405:8100::/32
⚠️ 注意:不同 CDN 的 IP 段每年可能调整,务必从其官网获取最新列表(如 Cloudflare 官方 IP 页面、阿里云 CDN 文档)。
3. 让日志或后端代码读到真实 IP
-
写入 access_log:修改
LogFormat,用%a(自动取REMOTE_ADDR,经mod_remoteip处理后就是真实 IP)LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined CustomLog logs/access_log combined -
PHP 中取值:直接用
$_SERVER['REMOTE_ADDR']即可(前提是mod_remoteip已生效) -
不依赖模块时的兜底方案(不推荐但可用):
$xff = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? ''; if ($xff) { $ips = array_map('trim', explode(',', $xff)); foreach ($ips as $ip) { if (filter_var($ip, FILTER_VALIDATE_IP) && !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { $real_ip = $ip; break; } } }
❌ 常见错误配置(别这么干)
- 把
ServerName写成ServerName X-Forwarded-For或类似字段 → 无效,Apache 不识别 - 只配
ProxyPreserveHost On→ 这只保留 Host 头,和 IP 无关 - 开启
mod_headers并RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e"→ 这是在伪造头,反而污染链路 - 忘记加载
mod_remoteip或没指定RemoteIPInternalProxy→ Apache 会忽略X-Forwarded-For,REMOTE_ADDR仍是 CDN 节点 IP
? 快速验证是否生效
- 访问你的网站,用浏览器开发者工具看请求头,确认含
X-Forwarded-For: xxx.xxx.xxx.xxx - 在服务器上执行:
curl -H "X-Forwarded-For: 1.2.3.4" http://localhost/test.php
查看 PHP 输出的
$_SERVER['REMOTE_ADDR']是否为1.2.3.4(需确保本地测试时也满足RemoteIPInternalProxy条件)
不复杂但容易忽略。

















