2013-10-14 683
Discuz论坛使用CDN后,用户访问网站的是通过CDN各节点间接访问网站服务器的,我们发现Discuz论坛设计上的问题可能会在获取用户IP时,直接获取CDN节点IP,而不能直接获取到用户的真实IP,在此提出一些解决方案。
该问题存在于任何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论坛后台分别清除缓存即可。
三句话浓缩人生
生活百科 2024-05-20
纯净生活—招商臻和璟园
生活百科 2024-05-28
再别东南,无问西东
生活百科 2024-06-21
不负青春,不负梦想,热烈祝贺儿子上岸东南!
生活百科 2021-04-14
研路兜兜转转,兜兜转转研路
生活百科 2021-06-22
感恩吉大,不说再见!
生活百科 2021-09-16
不负青春,不负汗水,吉林大学,我来了!
生活百科 2017-07-20
一图看懂高考平行志愿
生活百科 2018-08-02
你好!江苏省海安高级中学!
生活百科 2014-07-01
究竟哪里才是孩子们的起跑线
生活百科 2021-05-01
软件v2rayN入门教程
电脑应用 2022-02-28
家庭常用电线平方数与功率对照表
生活百科 2020-10-30
可孚红外线体温计KF-HW-001说明书
生活百科 2020-06-28
几款可以检测电脑配置的软件
电脑应用 2023-02-07
PE装机工具推荐—FirPE
资源中心 2019-12-08
热水器回水泵(循环泵)的安装图文教程
生活百科 2018-07-17
关于“菜鸟之家”网站
资源中心 2012-03-20
东南大学硕士研究生招生常用网址整理
生活百科 2025-03-08
西蒙电气开关接线详解
生活百科 2019-02-22
心电监护仪怎么看数据
生活百科 2023-08-22
扫码二维码
获取最新动态
