emlog博客系统(http://nctoro.com)使用加速乐CDN)后发现评论人和在线统计插件显示的IP都是加速乐(CDN)的节点IP,查阅了很多资料终于找到了解决办法:

打开includelibfunction.base.php这个文件,找到

/**
 * 获取用户ip地址
 */
function getIp() {
    $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';

 

在下面插入:

 if (isset($_SERVER['HTTP_X_REAL_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/',

 $_SERVER['HTTP_X_REAL_FORWARDED_FOR'])) {

$ip = $_SERVER['HTTP_X_REAL_FORWARDED_FOR'];

 } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/',

$_SERVER['HTTP_X_FORWARDED_FOR'])) {

 $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

} elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/',

$_SERVER['HTTP_CLIENT_IP'])) {

 $ip = $_SERVER['HTTP_CLIENT_IP'];

}

修改成功后保存,emlog就能正常显示评论人的真实IP了,当然在线统计插件也统计的真实IP而不是加速乐(CDN)的节点IP。要解决emlog使用加速乐(CDN)后无法记录真实IP的问题,需通过Nginx配置和PHP代码双重调整,具体步骤如下:


一、Nginx服务器配置

  1. 添加真实IP解析规则
    在Nginx配置文件(通常位于nginx.conf或站点配置文件中)的http{}块内添加以下代码,用于识别CDN传递的真实IP:

    set_real_ip_from 0.0.0.0/0; # 允许所有CDN节点IP:ml-citation{ref="2,3" data="citationList"} real_ip_header X-Forwarded-For;
    # 声明真实IP的请求头字段:ml-citation{ref="2,4" data="citationList"} real_ip_recursive on;
    # 递归解析多层代理IP:ml-citation{ref="3" data="citationList"}
  2. 修改日志格式
    调整Nginx日志格式以记录真实IP,在http{}块内新增日志格式:

    log_format realiplog '$http_x_forwarded_for - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';:ml-citation{ref="1" data="citationList"}

    并在站点配置中将access_log指向新格式:

    access_log /path/to/your/access.log realiplog;:ml-citation{ref="1" data="citationList"}

二、PHP代码调整

在emlog的PHP代码中(如涉及IP记录的功能模块),需优先读取X-Forwarded-For头信息:

if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0];
# 取第一个IP地址:ml-citation{ref="3,6" data="citationList"} } else { $ip = $_SERVER['REMOTE_ADDR']; }

此逻辑可覆盖CDN转发场景,并避免伪造IP的风险


三、防火墙与CDN的兼容性

若服务器防火墙(如宝塔面板的Nginx防火墙)仍误判CDN节点IP,需在防火墙配置中添加CDN的IP段为信任来源(具体方法需参考防火墙文档),或调整防火墙规则以基于X-Forwarded-For字段过滤请求


四、验证配置

  1. 测试日志记录
    访问网站后检查Nginx日志,确认记录的IP是否为用户真实IP
  2. PHP输出验证
    临时在页面中输出$_SERVER['HTTP_X_FORWARDED_FOR']$_SERVER['REMOTE_ADDR'],对比两者是否一致
  3. CDN配置检查
    确保加速乐已正确配置回源IP,且未覆盖或篡改X-Forwarded-For请求头

通过上述步骤,可确保emlog在CDN加速场景下正确记录用户真实IP。若问题仍存在,需排查CDN服务商是否使用了非标准的请求头字段(如CF-Connecting-IP等),并相应调整Nginx和PHP的解析逻辑