架设在国外主机上的博客,想要获取更快速度的访问,有一种办法就是使用CDN加速。但速度提上去后,访客评论时显示的地址就是CDN节点的地址,而不是访客评论时的真正IP。
网上搜索后,发现wordpress和discuz的解决方法较多,emlog的却很少,但还不是没有。找到两个方法:
第一种
打开emlog的安装目录,找到这个文件 include/lib/function.base.php , 大约在60行左右,看到如下代码:
/** * 获取用户ip地址 */ function getIp(){ $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; if(!preg_match("/^d+.d+.d+.d+$/", $ip)){ $ip = ''; } return $ip; }
修改成下面的即可:
/** * 获取用户ip地址 */ function getIp(){ $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $list = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $ip = $list[0]; } if(!preg_match("/^d+.d+.d+.d+$/", $ip)){ $ip = ''; } return $ip; }
注解:
$_SERVER[‘REMOTE_ADDR’] #正在浏览当前页面用户的 IP 地址。
$_SERVER[‘HTTP_X_FORWARDED_FOR’] #透过代理服务器取得客户端的真实 IP 地址
第二种
也是在上面所说的的位置上,将代码替换为:
/** * 获取用户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']; } if(!preg_match("/^d+.d+.d+.d+$/", $ip)){ $ip = ''; } return $ip; }
做完这些修改后,Emlog 就可以正常显示评论人的真实IP,网站统计插件统计的也是真实IP而不是CDN节点的IP。
这两种方法我选择的是第一种,主要是简洁方便,验证也是有效的。第二种未做测试,有兴趣的测试后可以反馈下哈。
欢迎转载,转载请注明出处:蔓草札记 » 开启CDN后Emlog无法正确获取访客评论IP地址的解决办法