网站使用CDN服务后统计网站真实的用户访问情况获取真实IP
使用了国外的空间的站长经常会苦恼空间访问速度慢,DNS解析反应慢的问题。为了解决这些问题,最好的办法就是使用CDN,加快博客和网站从国内的访问速度,提高用户体验度。
然而,网站在使用CDN服务后,却发现了一个问题:无法获取到用户访问的真实IP。后台注册或者评论显示的用户IP全部是CDN的IP,或者某一个固定IP地址。这样显然会影响一些功能的使用。
解决上面的问题,一种方法是插件法,这个方法不需要修改任何代码,简单方便。另一种方法自然是修改代码,通用性比较强。如果你的网站的访问速度慢,不妨试用下面的免费CDN,配以本篇文章的介绍的方法,就完美了。
- 1、Incapsula免费日本CDN加速和CDNZZ香港CDN节点加速(日本CDN节点加快访问果然有效果)
- 2、cloudflare免费CDN导致网站打不开的解决办法附我的操作实例(解决CDN导致网站打不开的问题)
- 3、回顾2011-七个可以在2012年继续使用的免费域名(搜集了一些可以长期使用的免费域名,适合新手)
网站使用CDN服务后统计网站真实的用户访问情况获取真实IP
一、安装CloudFlare WordPress插件获取真实IP
1、如果你的Wordpress正在使用CloudFlare免费DNS,那么可以直接安装CloudFlare WordPress插件,这款官方提供的插件的主要作用就是获取真实IP,另外它还会对你的WP进行一定的优化。
2、这里是CloudFlare WordPress插件下载地址,你可以直接在Wordpress后台插件页面中搜索安装。
3、安装后,先到你的CloudFlare账户中,获取API KEY,如下图:
4、然后回到Wordpress后台的CloudFlare设置中,添加以上信息,如下图:
5、提示如下就表示完成了,这个插件就可以正常工作了。
6、另外,在CloudFlare插件页面的下方还有一个优化功能,点击它,CloudFlare会对你的Wordpress进行自动优化。如下图:
二、安装Incapsula WordPress插件得到真实IP
1、如果你的Wordpress正在使用Incapsula免费CDN服务,照样可以方便安装Incapsula WordPress插件。这款插件就是由Incapsula官方提供的。
2、该插件会通过设置$_SERVER['REMOTE_ADDR']来获取用户的真实IP,同时Incapsula WordPress插件会在所有插件执行前完成获取真实IP的工作,从而让其它插件得到准确数据。
3、这里是Incapsula WordPress插件下载地址,当然可以直接从Wordpress后台直接安装。安装完成后,不需要任何操作,就可以正常工作了。
1、将一下代码添加到wp-config.php文件开头即可。
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $list[0];
}
2、效果见下图:
1、Discuz!论坛貌似没有专门的插件来解决使用了CDN后获取用户的真实IP的问题,但是我们可以通过修改代码的方法来实现。
2、Discuz! X2修改的方法是:用Notepad+打开/source/class/class_core.php 文件,搜索“HTTP_CLIENT_IP”,定位我们要修改的代码。如下图:
3、这上图中三行代码全部删除,记住只删除这三行代码,然后加入以下代码作替代。
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'],
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'],
4、Discuz! X2.5修改的方法是:打开/source/class/discuz/discuz_application.php文件,搜索“HTTP_CLIENT_IP”,同样找到这三行,用以上代码替换。如下图:
5、最后的效果如下图:
6、当然不要忘记到Discuz! 后台更新一下缓存。
PS:2015年0月27日更新,感谢 itzmx.com站长提供discuz x3.1 20150609更新后,CDN下获取用户真实IP的方法。
1、对于正在使用CDN服务的用户,找到这个文件:\source\class\discuz\discuz_application.php,搜索,在378行左右。
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;
}
2、将这一段替换为以下代码:
private function _get_client_ip() {
$ip = $_SERVER['REMOTE_ADDR'];
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'], $matches)) {
foreach ($matches[0] AS $xip) {
if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
$ip = $xip;
break;
}
}
} 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;
}
1、请用下列代码来代替你在ASP中获取用户IP的程序代码。
2、代码如下:
Function checkip(checkstring)
dim re1
set re1=new RegExp
re1.pattern="^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$"
re1.global=false
re1.Ignorecase=false
checkip=re1.test(checkstring)
set re1=nothing
End Function
Function get_cli_ip()
dim client_ip
if checkip(Request.ServerVariables("HTTP_CLIENT_IP"))=true then
get_cli_ip = checkip(Request.ServerVariables("HTTP_CLIENT_IP"))
else
MyArray = split(Request.ServerVariables("HTTP_X_FORWARDED_FOR"),",")
if ubound(MyArray)>=0 then
client_ip = trim(MyArray(0))
if checkip(client_ip)=true then
get_cli_ip = client_ip
exit function
end if
end if
get_cli_ip = Request.ServerVariables("REMOTE_ADDR")
end if
end function
1、主流的网站程序,如Wordpress、Discuz!在使用CDN后获取真实IP网上都有非常多的教程,很容易解决这个问题。
2、非主流的网站程序,可以用PHP、ASP代码获取CDN后真实IP的通用方法来解决这一问题。
文章出自:免费资源部落 / 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。 禁止全文转载。
您或许对下面这些文章有兴趣: 本月吐槽辛苦排行榜
-
WordPress看来还是有优势的,苦了我这样的不懂代码的人,自己安装的论坛程序不知道如何添加代码。
[回复] -
原来是因为使用了CDN的原因,我的wordpress后台的评论全部是一个固定IP。刚开始还没有在意过。
[回复] -
没用过CDN,我只用PHP缓存。
[回复] -
博主能否把ASP那部分怎么操作讲清楚?
[回复] -
用了CDN还真是麻烦,老是出现打不开的情况。
[回复] -
额,我的投稿沉了吗?
[回复]qi 回复:
@jageil, 你给我邮箱发了稿件了吗?
[回复] -
修改了代码后,每次升级程序后又要重新修改。真是麻烦。
[回复] -
原来是CDN搞的鬼,我说我WP的评论的IP显示都是一样的,害得那个防垃圾插件都没有用了。
[回复] -
直接在wp-config添加代码就搞定了。用了插件其实也是在配置中添加代码。
[回复] -
为啥要获取真实的IP呢?没有IP一样可以评论,一样可以防止垃圾评论。
[回复] -
WordPress自带的AK防垃圾插件,使用CDN应该没有影响吧。有的时候,一些正常的评论也被当成垃圾评论。无语!
[回复] -
安装插件后搞定。
[回复] -
呃不是哦……DZX2.5内部那个代码真的不要去换了……
它已经做好了X_FORWARD_FOR的判定了,博主没看到吗……
倒是DZX2的判定代码稍稍有点问题。
实测环境下,DZX2.5能在incapsula的CDN上不经过任何配置获取正确的IP~[回复]qi 回复:
@oott123, X_FORWARD_FOR好像是DZ2中也有,我以为都要代替。2.5是正常的?
[回复] -
我的网站是 Discuz! x2.5 的,为什么按照上面写的改了以后就无法访问了呢?现在只能恢复成原来的文件。
顺便贴一下改了以后的那段代码:
private function _get_client_ip() {
$ip = $_SERVER[‘REMOTE_ADDR’];
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’],
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’], $matches)) {
foreach ($matches[0] AS $xip) {
if (!preg_match(‘#^(10|172.16|192.168).#’, $xip)) {
$ip = $xip;
break;
}
}
}
return $ip;
}[回复] -
哦,那我再试一下
[回复] -
唉,cname和mx记录无法同时存在,为啥cdnzz不提供一个A记录呢,郁闷啊。
[回复] -
我用了X25修改后,提示是355行错误,
354.
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’],355.
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’],又要用回原来的。白忙了。网上说的都一样,没有一个通过X25测试的。全部OUT
[回复] -
请问下 如果是zencart我怎么添加代码,我能找到要修改的那段代码,但是我不知道怎么修改这段代码
function zen_get_ip_address() {
if (isset($_SERVER)) {
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED'])) {
$ip = $_SERVER['HTTP_X_FORWARDED'];
} elseif (isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_FORWARDED'])) {
$ip = $_SERVER['HTTP_FORWARDED'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
} else {
if (getenv('HTTP_X_FORWARDED_FOR')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif (getenv('HTTP_CLIENT_IP')) {
$ip = getenv('HTTP_CLIENT_IP');
} else {
$ip = getenv('REMOTE_ADDR');
}
}return $ip;
}[回复] -
博主的文笔挺不错的,学习了。
[回复] -
那麼discuz 7.2?
[回复]