Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

[复制链接]
otherbank 发表于 2012-4-16 10:26:16 | 显示全部楼层 |阅读模式
现象:
1.DZ论坛可能无法获得用户的真实IP
2.论坛访问量过大的话,可能会导致用户访问时提示“抱歉,您的 IP 地址不在被允许,或您的账号被禁用,无法访问本站点”

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

解决方法(DZ X2为例):
打开DZ    /source/class/class_core.php 文件
找到第341行,或者搜索“HTTP_CLIENT_IP”,找到如下代码:
  1. if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match(‘/^([0-9]{1,3}\.){3}[0-9]{1,3}$/’, $_SERVER['HTTP_CLIENT_IP'])) {
  2. $ip = $_SERVER['HTTP_CLIENT_IP'];
  3. } 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'],
  4. 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:
将以上代码修改为:
  1. 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'],
  2. 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'],
复制代码
方法2:
临时注释部分代码,也就是比原来的代码多了二对注释符(/*和*/)即将上面的代码修改成:
  1. /*
  2. if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match(‘/^([0-9]{1,3}\.){3}[0-9]{1,3}$/’, $_SERVER['HTTP_CLIENT_IP'])) {
  3. $ip = $_SERVER['HTTP_CLIENT_IP'];
  4. } else
  5. */
  6. 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'],
  7. /*
  8. 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
  9. */
  10. 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'],
复制代码
以上操作后,登陆CDN和你的Discuz!论坛后台分别清除缓存即可。
备注:部分版本的Discuz!该文件中可能有区别,
方法来自加速乐,原文地址:http://bbs.jiasule.com/thread-4-1-1.html


abcnic 发表于 2012-4-16 14:49:09 | 显示全部楼层
沙发学习呢  呵呵
回复

使用道具 举报

lijiayan 发表于 2012-4-16 16:06:52 | 显示全部楼层
支持个
回复

使用道具 举报

lijiayan 发表于 2012-4-16 16:16:04 | 显示全部楼层
本帖最后由 lijiayan 于 2012-4-16 16:17 编辑

找不到呀 我2.5
回复

使用道具 举报

liqu12511 发表于 2012-4-16 16:19:47 | 显示全部楼层
感谢楼主分享的教程
回复

使用道具 举报

中国在线社区 发表于 2012-4-17 09:16:30 | 显示全部楼层
:'(
回复

使用道具 举报

李渠 发表于 2012-4-28 13:17:25 | 显示全部楼层
这个很实用的
回复

使用道具 举报

algi 发表于 2012-6-19 19:03:24 | 显示全部楼层
X2.5找不到
回复

使用道具 举报

sxbxjhwm 发表于 2012-7-4 17:20:55 来自手机 | 显示全部楼层
同样 2.5 ,求解
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-23 21:24 , Processed in 0.027468 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表