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

添加评论 2010年4月16日

一直都是使用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();
  1. 2011年3月4日 at 09:33 | #1

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

  2. 2011年3月21日 at 21:44 | #2

    安装wp_syntax插件就可以了。

  3. 2011年4月15日 at 19:55 | #3

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

  4. 2011年4月20日 at 14:06 | #4

    没有影响,大型网站都是有CDN加速的。

  1. 还没有 trackbacks
订阅评论