使用阿里云 ESA 后网站获取的访客IP错误解决方法

前言

WordPress 在阿里云 ESA 反向代理下获取的 IP 不对,原因是 ESA 作为反向代理,WordPress 默认只读取 REMOTE_ADDR(即 ESA 节点 IP),而非用户真实 IP,解决思路是将 REMOTE_ADDR 重设为用户真实 IP

一、先在 ESA 开启真实 IP 透传

图片[1]-使用阿里云 ESA 后网站获取的访客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]);
}
图片[2]-使用阿里云 ESA 后网站获取的访客IP错误解决方法-黎洛极客网

保存后 WordPress 的评论、统计及插件即可显示真实访客 IP,其它 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;

© 版权声明
THE END
喜欢就支持一下吧!
点赞72赞赏 分享