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

所属分类: CMS教程 / discuz 阅读数: 632
收藏 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 X2正式版forum首页的$navtitle显示不正确只显示论坛的解决方法

官方一句话回复: SEO 设置里面 自行设置。其实就是通过... 查看详情
收藏 0 赞 0 分享

如何为 Discuz! X2 配置伪静态规则[超详细]

URL 静态化是一个有利于搜索引擎的设置,通过 URL 静态化,达到原来是动态的 PHP 页面转换为静态化的 HTML 页面,可以提高搜索引擎抓取,当然,这里的静态化是一种假静态,目的只是提高搜索引擎的搜索量,下面主要介绍配置方法。 分两种情况,一种是独立主机用户,这部分用户拥有... 查看详情
收藏 0 赞 0 分享

discuz x2 多服务器伪静态规则

Apache Web Server(独立主机用户) 复制代码代码如下: <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)/top... 查看详情
收藏 0 赞 0 分享

Discuz 7.2 主题列表页模板(Forumdisplay.htm)修改教程

1. 释版风格文件请勿直接用到站点中 因为注释已经把文件加大了 如果用在站点模版中 会造成不必要的拖速 注释文件仅供本地学习与参考! 2. 您或多或少需要对基本的HTML代码有所认识 不然这个注释版可能对您没有帮助。 3. 文件内因为注释很多 如果使用一般的记事本打开阅读的话 会... 查看详情
收藏 0 赞 0 分享

Discuz-x系列教程 DX的css命名规则、缓存、加载机制

首先,每个页面都会加载以下两个类似的css: data/cache/style_1_common.css data/cache/style_1_forum_index.css 一、两个文件名的命名规则 style_1_common.css |--是整站通用的全局css,所以命名为... 查看详情
收藏 0 赞 0 分享

discuz x2.0 DIY页面调用分类信息的实现方法

在使用Discuz过程中,很多朋友会遇到一个问题,DIY页面如何调用分类信息呢,这个问题也曾经困扰过我,经过研究发现了调用的方法,现在就分享给大家。   第一步,要在论坛后台设置好分类信息,这里就不详细讲解了,我的博客有一篇关于此操作的详细文章,不了解的朋友可以查看下(http... 查看详情
收藏 0 赞 0 分享

快速删除DiscuzNT论坛数据表和存储过程

本来想一个一个删除的,打开数据库一看那么多的表和存储过程,就放弃这种笨办法了,于是决定用SQL语句来搞定。代码如下: 复制代码代码如下: -----------------------------删除数据表--------------------- DECLARE @au_lna... 查看详情
收藏 0 赞 0 分享

Discuz! 远程附件设置简明教程

(1)减少服务器流量(2)减轻服务器负载(3)节约 WEB 空间第一、Discuz!5.5 远程附件的设置方法,如图 1 所示配置  设置方法:1. 如果某 FTP 帐号对应的空间地址为:http://www.yanshi.cn该空间对应的目录例如图 1-1 所示: ... 查看详情
收藏 0 赞 0 分享

Discuz 7.0/7.1/7.2 首页空白的解决方案讨论

1、文件设置问题导致首页空白 (1). 不是二进制上传; (2). 目录属性没有设置为777; (3). 网站目录为中文名; 2、环境配置有问题导致首页空白 (1). extension_dir = 和PHP实际的ext目录不一致。 (2). 没有把PHP目录和ext目录添加到环... 查看详情
收藏 0 赞 0 分享

火车头 Discuz-X 1.0 论坛免登陆发布接口

Discuz-X 1.0 论坛免登陆发布接口使用说明 一、功能特性 1、免登陆,用户可以设置验证密码来防止未授权的访问. 2、多用户随机发布主题和回复. 二、使用教程 1、文字教程 1.1、选择您网站对应的接口文件.如您网站是gbk编码,请选择 jiekou_gbk.php,如果... 查看详情
收藏 0 赞 0 分享
查看更多