使用CDN后Discuz!论坛提示”抱歉,你的IP地址不在被充许…”的解决方案

使用CDN后,用户访问网站的是通过加速乐各节点间接访问网站服务器的,近期我们发现Discuz!论坛设计上的问题可能会在获取用户IP时,直接获取节点IP,而不能直接获取到用户的真实IP,在此提出一些解决方案。

该问题存在于任何CDN产品,如果您使用了CDN产品,无论是加速乐还是其它CDN产品,该方法都适用。

该问题导致的结果:

1.DZ论坛可能无法获得用户的真实IP,导致某些用户IP显示的是加速乐节点的IP

2.论坛访问量过大的话,可能会导致用户访问时提示“抱歉,您的 IP 地址不在被允许,或您的账号被禁用,无法访问本站点”


产生原因:

使用CDN,对于网站访客来说,相当于使用了代理访问,而DZ在设计上,是优先获取代理IP,其它才会检测代理服务器是否将用户真实IP传输过来,也就是说获取代理IP优先于用户真实IP。如果您的网站不需要对用户访问做过多的限制,强烈建议按照以下方法进行:

解决方法(DZ X2为例):

打开DZ    /source/class/class_core.php 文件

找到第341行,或者搜索“HTTP_CLIENT_IP”,找到如下代码:

if (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’];
} elseif(isset($_SERVER[‘HTTP_X_FORWARDED_FOR’]) AND preg_match_all(‘#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s’, $_SERVER[‘HTTP_X_FORWARDED_FOR’],

if (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’]; } elseif(isset($_SERVER[‘HTTP_X_FORWARDED_FOR’]) AND preg_match_all(‘#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s’, $_SERVER[‘HTTP_X_FORWARDED_FOR’],

方法1:

删除加红的部分

方法2:
临时注释加红部分,也就是比原来的代码多了二对注释符(/*和*/)即将上面的代码修改成:
/*
if (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’];
} else
*/
if(isset($_SERVER[‘HTTP_X_FORWARDED_FOR’]) AND preg_match_all(‘#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s’, $_SERVER[‘HTTP_X_FORWARDED_FOR’],

/*

if (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’]; }else

*/

if(isset($_SERVER[‘HTTP_X_FORWARDED_FOR’]) AND preg_match_all(‘#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s’, $_SERVER[‘HTTP_X_FORWARDED_FOR’],

以上操作后,登陆加速乐和你的Discuz!论坛后台分别清除缓存即可。

备注:加速乐发现部分版本的Discuz!该文件中没有加红的第2部分,这种版本,您只需要删除或注释第一部分即可,若您遇到其它情况请直接联系加速乐站内QQ客服,帮助您解决。

6 thoughts on “使用CDN后Discuz!论坛提示”抱歉,你的IP地址不在被充许…”的解决方案

发表评论

电子邮件地址不会被公开。