零说 · 2026-04-03 0

使用阿里云ESA后WordPress获取的访客IP错误

使用阿里云 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;