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

所属分类: CMS教程 / discuz 阅读数: 733
收藏 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!7.0主题回收站功能详解

关键字描述:Discuz!7.0 主题 回收站 功能 详解 康盛创想 建站产品 Discuz!7.0是康盛创想(Comsenz)公司于2008年12月份发布的一款论坛BBS建站产品。在Discuz!7.0中,主题回收站功能将前台删除的主题先放到主题回收站里,以便管理员进一
收藏 0 赞 0 分享

DISCUZ 7.0文件上传过程中出现I/O错误!

关键字描述:出现 错误 过程 上传 文件 目录 图片   问题 头像 如果你的论坛已经打上补丁,但上传头像是仍然出现出现I/O错误 解决办法: 在网站根目录新建一个 .htaccess 文件 内容: <IfModule mod_security.
收藏 0 赞 0 分享

Discuz!7.0道具中心功能详解

关键字描述:功能 详解 中心 道具 设置 自动 价格 可以 如果 > 如下   Discuz!7.0是康盛创想(Comsenz)公司于2008年12月份发布的一款论坛BBS建站产品。在Discuz!7.0中,道具中心为论坛提供了丰富多彩的娱乐功能,可以有效的增强论坛会
收藏 0 赞 0 分享

Discuz论坛上传图片附件成功贴子里看不到图片

关键字描述:图片 贴子 看不到 成功 附件 上传 论坛   设置 可以 论坛上传图片附件成功后在贴子里怎么看不到图片?上几天还蛮好的,一切正常,就今天和昨天还可以上传,但是上传上之后就看不到图,但是点上传之后再插入的图可以看到,请问这是怎么回事? 在官方
收藏 0 赞 0 分享

Discuz!7.0电子商务功能详解

关键字描述:详解 功能 电子商务 积分 设置 交易 > 支付 单位 数额   Discuz!7.0是康盛创想(Comsenz)公司于2008年12月份发布的一款论坛BBS建站产品。在Discuz!7.0版本中完善了论坛电子商务的功能,下面笔者就为大家详细的介绍下此功能
收藏 0 赞 0 分享

如何设置Discuz!7.0分类信息功能

关键字描述:信息 功能 分类 设置 如何 选项 &ldquo &rdquo 如下 添加   Discuz!7.0是康盛创想(Comsenz)公司于2008年12月份发布的一款论坛BBS建站产品。在Discuz!7.0版本中,为了更加聚合论坛的信息,用户可以设置论坛的分类信
收藏 0 赞 0 分享

集中删除discuz!论坛垃圾广告的技巧

关键字描述:广告 技巧 垃圾 论坛 删除 集中 设置 审核 帖子 里面   去年曾经介绍过“一劳永逸 杜绝Discuz!论坛垃圾广告”。有些朋友说不方便,这主要是没有设置好,根据论坛的实际情况设置好后,很管用的。   用Discuz!论坛系统的
收藏 0 赞 0 分享

Discuz!7.0标签聚合功能详解

关键字描述:功能 详解 聚合 标签 显示 应用 安装 发布 论坛 出来   Discuz!7.0是康盛创想(Comsenz)公司于2008年12月份发布的一款论坛BBS建站产品。标签聚合功能是Discuz! 7.0的新功能,当您的UCenter下安装了两个及两个以上应用的
收藏 0 赞 0 分享

Discuz 6.0上传图片提示“无效的图片文件”解决方案

关键字描述:图片 文件 解决方案 无效 提示 上传 问题   &rdquo   Discuz 6.0论坛上传图片时也显示“无效的图片文件”,明明是有效图片为什么会提示是无效的图片文件呢? 后来经过我们反复测试与分析 终于知道问题所在了,下面
收藏 0 赞 0 分享

Discuz!NT 2.5升级到2.6 SQL Server教程

关键字描述:教程 升级 目录 NT Discuz 社区 论坛 文件 API 整合 平台   Discuz!NT 2.6 不仅仅是简单功能的升级,更重要的是应用理念的创新。Discuz!NT 2.6 融入了全新的社区产品开发理念,推出了开放的 API 接口。利用 API 可
收藏 0 赞 0 分享
查看更多