使用CDN加速后对PHP获取IP的影响

一直都是使用DISCUZ的获取客户端IP的函数,但今日发现网站使用CDN加速后,网站统计出了问题,获取到的IP有部分是CDN节点的IP,而程序统计是以唯一IP判断,导致统计到的IP比实际IP少很多。改动获取IP的函数后恢复正常。
原获取IP的方法:

if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$onlineip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$onlineip = $_SERVER['REMOTE_ADDR'];
}
 
preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches);
$onlineip = $onlineipmatches[0] ? $onlineipmatches[0] : 'unknown';
unset($onlineipmatches);


改成如下:

function get_real_ip()
{
       $ip=false;
       if(!empty($_SERVER["HTTP_CLIENT_IP"]))
       {
            $ip = $_SERVER["HTTP_CLIENT_IP"];
       }
       if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
       {
            $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
            if ($ip)
            {
                     array_unshift($ips, $ip); $ip = FALSE;
            }
            for ($i = 0; $i < count($ips); $i++)
            {
                     if (!eregi ("^(10|172\.16|192\.168)\.", $ips[$i]))
                     {
                               $ip = $ips[$i];
                               break;
                     }
            }
       }
       return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}
$onlineip = get_real_ip();
此条目发表在 Discuz!, PHP 分类目录,贴了 , , 标签。将固定链接加入收藏夹。

使用CDN加速后对PHP获取IP的影响》有 4 条评论

  1. 书生 说:

    请教博主,你这个插入的代码怎么弄成这个样子的,下面带滚动条的。谢谢

  2. VVDAO 说:

    请教博主:CDN对排名有没有影响?

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">