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服务器配置
-
添加真实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"} -
修改日志格式
调整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
字段过滤请求。
四、验证配置
- 测试日志记录
访问网站后检查Nginx日志,确认记录的IP是否为用户真实IP。 - PHP输出验证
临时在页面中输出$_SERVER['HTTP_X_FORWARDED_FOR']
和$_SERVER['REMOTE_ADDR']
,对比两者是否一致。 - CDN配置检查
确保加速乐已正确配置回源IP,且未覆盖或篡改X-Forwarded-For
请求头。
通过上述步骤,可确保emlog在CDN加速场景下正确记录用户真实IP。若问题仍存在,需排查CDN服务商是否使用了非标准的请求头字段(如CF-Connecting-IP
等),并相应调整Nginx和PHP的解析逻辑。
发表评论