Discuz论坛使用CDN后无法获取用户真实IP的解决方法

所属分类: CMS教程 / discuz 阅读数: 921
收藏 0 赞 0 分享

该问题存在于任何CDN产品,如果您使用了CDN产品,该Discuz方法都适用。

该问题导致的结果:
1.Discuz论坛可能无法获得用户的真实IP,导致某些用户IP显示的是加速乐节点的IP
2.论坛访问量过大的话,可能会导致用户访问时提示“抱歉,您的 IP 地址不在被允许,或您的账号被禁用,无法访问本站点”

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

解决方法(Discuz X2):

打开Discuz    /source/class/class_core.php 文件
找到第341行,或者搜索“HTTP_CLIENT_IP”,找到如下代码:

复制代码
代码如下:

function _get_client_ip() {
$ip = $_SERVER['REMOTE_ADDR'];
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'], $matches)) {
foreach ($matches[0] AS $xip) {
if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
$ip = $xip;
break;
}
}
}
return $ip;
}

将以上代码修改为:


复制代码
代码如下:

function _get_client_ip() {
$ip = $_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'];
}
return $ip;
}

解决方法(Discuz x2.5)

打开文件\source\class\discuz\discuz_application.php 找到如下代码:


复制代码
代码如下:

private function _get_client_ip() {
$ip = $_SERVER['REMOTE_ADDR'];
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'], $matches)) {
foreach ($matches[0] AS $xip) {
if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
$ip = $xip;
break;
}
}
}
return $ip;
}

将其修改为:


复制代码
代码如下:

private function _get_client_ip() {
$ip = $_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'];
}
return $ip;
}

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

更多精彩内容其他人还在看

Discuz! X1.5 防CC脚本设置方法

晚上比较郁闷,论坛被CC攻击,一直无法正常访问,机房那边也没办法处理,请教了一下几位所谓的DDOS高手,也没有解决办法,从百度找了一圈发现DZ自带CC防御级别设置
收藏 0 赞 0 分享

Discuz!安装提示“include_path='.;c:\php5\pear'”错误的解决方法

最近Discuz!服务器迁移,结果在安装好后提示“include_path='.;c:\php5\pear'”错误!
收藏 0 赞 0 分享

Discuz! 远程附件设置图文说明

Discuz!远程附件设置说明,主要是节约论坛服务器资源。
收藏 0 赞 0 分享

Discuz 密码错误次数过多导致等待15分钟的解决办法

Discuz 密码错误次数过多导致等待15分钟的解决办法,需要的朋友可以参考下。
收藏 0 赞 0 分享

discuz X1.5 更换服务器空间详细步骤 防止出错

discuz X1.5 更换服务器空间详细步骤 防止出错,需要换论坛服务器的朋友可以参考下。
收藏 0 赞 0 分享

discuz X1.5 论坛后台站长常用操作小结

这些算是论坛管理员比较常用的设置,具体详细设置还得自己看后台所显示的详细说明,都说得很明白,discuz后台相关设置是说不完的,每个人的需要不同设置也不同,很多还是得靠管理员自己
收藏 0 赞 0 分享

discuz X1.5 ip不在被允许的范围内,或你的账号被禁用,无法访问本站点的解决方法

登陆discuz时,显示discuz 对不起你的ip不再被允许的范围内,或你的账号被禁用,无法访问本站点
收藏 0 赞 0 分享

DZ X2.0 教你快速了解Discuz!程序文件功能,修改文件不求人

信有不少人热衷于基于修改原有系统文件所做的插件,当然了解程序文件功能是最重要的,下面我把Discuz! X2.0主要的程序文件功能说一下。
收藏 0 赞 0 分享

Discuz!在论坛主题中快速插入UCHome相册图片

关键字描述:相册 图片 插入 快速 论坛 主题 用户 可以 SNS UCenter   近日,康盛创想BBS与SNS社区产品双剑合璧,推出了Discuz! 7.0和UCenter Home (简称UCHome)1.5。这两款社区产品不仅通过UCenter 1.5用户中心打
收藏 0 赞 0 分享

Discuz论坛的WAP功能在手机上使用感爱

关键字描述:使用 在手 功能 论坛 手机 访问 就是 速度 感觉 大家 我的论坛WAP功能无法使用,一点击就下载一个什么东西,这个论坛是这样的,不信大家试试看,有高人知道原因吗?怎么处理? WAP是用手机访问的地址。 你用手机浏览器输入http://bbs.
收藏 0 赞 0 分享
查看更多