Discuz论坛应用CDN后,用户根据CDN的连接点间接访问网络服务器。发现Discuz论坛设计上的问题很可能是马上得到CDN的连接点IP,而不是马上得到用户的真实IP。在此,提出一些解决办法。
所有的CDN产品都存在这个问题。如果应用CDN产品,可以使用这个Discuz方法。
这个问题的结果:
1。Discuz论坛很可能无法获取用户真实IP,导致部分用户IP显示加速音乐的连接点IP上的信息
2。如果论坛访问量过大,很可能会提醒用户“对不起,您的详细IP地址不允许,或者您的账户被禁止访问本网站”
原因:
对于网站访问者来说,申请CDN相当于申请代理访问,而Discuz在设计方案中优先获取代理IP,其他的会检查代理网络服务器是否回传用户的真实IP。换句话说,获得代理IP优先于用户的真实IP。如果您的网站不需要过多限制用户的访问,强烈要求通过以下方式做到这一点:
解决方案(X2迪斯库兹):
打开discussion/source/class/class_core.php文档
查找第341行,或者搜索“HTTP_CLIENT_IP”查找以下代码:
复制以下代码:
function_get_CLIENT_IP(){
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'])和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;
}
解决方案(Discuzx2.5)
打开文件\source\class\discussion\discussion_application.php,查找以下代码:
复制代码编码如下:
Privatefunction_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'])和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;
}
将其更改为:
复制代码编码如下:
Privatefunction_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论坛后台管理,清空缓存。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)