使用阿里云 ESA 后 WordPress 拿到的 IP 不对,是因为 ESA 是反向代理,WordPress 默认只认 REMOTE_ADDR(即 ESA 节点的 IP),而不是用户真实 IP。
解决办法就是重设REMOTE_ADDR为用户真实IP。
一、先在 ESA 开启真实 IP 透传
1.进入 ESA 控制台 → 站点管理 → 你的站点
2.左侧:规则 → 转换规则 → 托管转换
3.开启 添加真实客户端 IP 标头(ali-real-client-ip)
二、在 WordPress 里修正 IP
编辑站点根目录的 wp-config.php,在 <?php 下一行加入:
// 阿里云 ESA 真实 IP
if (isset($_SERVER['HTTP_ALI_REAL_CLIENT_IP'])) {
// 优先用 ESA 官方头
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_ALI_REAL_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// 备用 X-Forwarded-For
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = trim($ips[0]);
}
保存后,WordPress 评论、统计、插件就会显示真实访客 IP。
如有需要,可以在适当的地方添加一下测试代码查看REMOTE_ADDR。
<?php
echo 'REMOTE_ADDR: '.$_SERVER['REMOTE_ADDR']."<br>";
echo 'ali-real-client-ip: '.$_SERVER['HTTP_ALI_REAL_CLIENT_IP']."<br>";
echo 'X-Forwarded-For: '.$_SERVER['HTTP_X_FORWARDED_FOR']."<br>";
其它PHP程序也是相同的道理。在一个通用的文件里添加修正代码即可。
同理,其它CDN或反代也原理相同。稍作修改即可获取真实IP。
其实也可以nginx修正,在服务器配置里直接改写 REMOTE_ADDR,理论上更改好,但需要获取ESA的网络以设置白名单,如果阿里云IP有变动,还需要及时更改,相对麻烦一些。并且免费版无法直接获取到ESA的网段。就不推荐了。以下代码仅做记录。暂不推荐。
# Nginx信任 ESA 节点(需要获取阿里云最新网段)
set_real_ip_from 47.88.0.0/16;
set_real_ip_from 47.90.0.0/16;
set_real_ip_from 118.178.0.0/16;
# ... 其他 ESA 网段
# 从 ESA 传递的头读取真实 IP
real_ip_header ali-real-client-ip;
real_ip_recursive on;
