WordPress 使用 CDN 后获取访客真实 IP 的完整解决方案
在使用 Cloudflare、阿里云 CDN、腾讯云 CDN 等加速服务后,许多 WordPress 站长发现后台评论显示的 IP 都变成了 CDN 节点 IP,这不仅影响用户行为分析,还可能导致 IP 封禁功能失效。本文将详细介绍多种获取真实 IP 的解决方案,从简单的代码插入到服务器级配置,帮助您彻底解决这一问题。
为什么 CDN 会隐藏真实 IP?
CDN(内容分发网络)的工作原理是将用户请求先路由到最近的边缘节点,再由节点向源站请求内容。这个过程中,源站服务器看到的”访客”实际上是 CDN 节点,而非真实用户。
常见场景问题:
-
评论管理后台显示同一 IP 大量评论(实为多个用户)
-
防垃圾评论插件失效(Akismet 等依赖 IP 判断)
-
登录限制插件误封(同一节点 IP 被多次计算)
-
访问统计分析不准确
WordPress 代码解决方案
方案 1:通用 CDN 兼容代码(适用大多数情况)
将以下代码添加到
wp-config.php 文件的最顶部(<?php 标签之后):/**
* 获取 CDN 后的真实 IP 地址
* 支持:阿里云 CDN、腾讯云 CDN、百度云加速、AWS CloudFront 等
*/
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// X-Forwarded-For 格式:客户端IP, 代理1, 代理2
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
// 取第一个 IP 作为真实 IP
$_SERVER['REMOTE_ADDR'] = trim($ips[0]);
}}
工作原理: 大多数 CDN 会将真实 IP 写入
X-Forwarded-For HTTP 头,格式为逗号分隔的 IP 链,第一个即为用户真实 IP。方案 2:Cloudflare 专用优化代码
如果使用 Cloudflare,强烈建议使用以下更安全的方案:
/**
* Cloudflare 专用:获取真实 IP
* 使用 CF-Connecting-IP 头,该头无法被客户端伪造
*/
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
}
优势: Cloudflare 的
CF-Connecting-IP 头由 Cloudflare 服务器添加,无法被客户端伪造,安全性更高。方案 3:智能多 CDN 兼容方案
如果您的网站可能切换不同 CDN,使用此综合方案:
/**
* 智能识别多种 CDN 的真实 IP 头
* 优先级:Cloudflare > 标准 CDN > 直接访问
*/
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
// Cloudflare 专用头(最可靠)
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// 标准 CDN 头(阿里云、腾讯云等)
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = trim($ips[0]);
} elseif (isset($_SERVER['HTTP_X_REAL_IP'])) {
// 部分 CDN 使用的替代头
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_REAL_IP'];
}
Web 服务器级配置方案
Nginx 服务器配置
在网站配置文件(通常位于
/etc/nginx/conf.d/your-site.conf 或 /usr/local/nginx/conf/vhost/your-site.conf)中添加:server {
listen 80;
server_name example.com;
# 获取真实 IP 配置
set_real_ip_from 103.21.244.0/22; # Cloudflare IP 段示例
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
# 更多 CDN IP 段...
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# 其他配置...
}
关键指令说明:
-
set_real_ip_from:指定信任的 CDN 服务器 IP 段(务必填写具体 IP 段,不要用 0.0.0.0/0) -
real_ip_header:指定从哪个 HTTP 头获取 IP -
real_ip_recursive on:递归查找,跳过 CDN 自身的 IP
获取 Cloudflare IP 段的自动化脚本:
#!/bin/bash
# 自动下载并更新 Cloudflare IP 列表
curl -s https://www.cloudflare.com/ips-v4 > /etc/nginx/cloudflare-ips-v4
curl -s https://www.cloudflare.com/ips-v6 > /etc/nginx/cloudflare-ips-v6
# 在 nginx 配置中引入
echo "include /etc/nginx/cloudflare-ips-v4;" >> /etc/nginx/nginx.conf
echo "include /etc/nginx/cloudflare-ips-v6;" >> /etc/nginx/nginx.conf
# 测试并重载
nginx -t && systemctl reload nginx
Apache 服务器配置
启用
mod_remoteip 模块并配置:1. 启用模块:
a2enmod remoteip
2. 创建配置文件
/etc/apache2/conf-available/remoteip.conf:# 远程 IP 头设置
RemoteIPHeader X-Forwarded-For
RemoteIPProxiesHeader X-Forwarded-By
# 信任的 CDN IP 段(Cloudflare 示例)
RemoteIPTrustedProxy 103.21.244.0/22
RemoteIPTrustedProxy 103.22.200.0/22
RemoteIPTrustedProxy 103.31.4.0/22
# 添加更多...
3. 启用配置并重启:
a2enconf remoteip
systemctl restart apache2
主流 CDN 配置对照表
| CDN 服务商 | 真实 IP Header | 特殊说明 | 推荐方案 |
|---|---|---|---|
| Cloudflare | CF-Connecting-IP |
无法伪造,最安全 | 优先使用 CF-Connecting-IP |
| 阿里云 CDN | X-Forwarded-For |
第一个 IP 为真实 IP | 取 X-Forwarded-For 第一个 |
| 腾讯云 CDN | X-Forwarded-For |
第一个 IP 为真实 IP | 取 X-Forwarded-For 第一个 |
| 百度云加速 | X-Forwarded-For |
第一个 IP 为真实 IP | 取 X-Forwarded-For 第一个 |
| AWS CloudFront | X-Forwarded-For |
第一个 IP 为真实 IP | 取 X-Forwarded-For 第一个 |
| 又拍云 | X-Real-IP |
直接使用该头 | 使用 X-Real-IP |
故障排查指南
配置后仍显示 CDN IP
排查步骤:
-
确认代码是否添加到
wp-config.php最顶部(在require_once(ABSPATH . 'wp-settings.php');之前) -
检查 CDN 是否启用了”回源跟随”或类似功能
-
确认服务器是否缓存了 PHP 文件(重启 PHP-FPM)
最后
-
生产环境务必使用服务器级配置(Nginx/Apache),性能最好且全局生效
-
安全优先使用 Cloudflare 并配合
CF-Connecting-IP,避免 IP 伪造风险 -
定期审计检查防火墙规则,确保源站不直接暴露
-
备份先行修改配置文件前务必备份,避免网站无法访问
本文系作者 @
雨落祈星台
原创发布在 雨落Droplogue ,未经许可,禁止转载。
评论