php 获取真正的ip地址而不是代理ip

2015年07月29日 16:33 by:唠吧小站

声明:此函数非唠吧小站远程,代码从ecshop中分离。

当用户流量的时候有时候是代理服务器这时候要想获取访问者的真实ip时可以用下面的代码:

虽然用户可以伪装ip和代理但是原来真实的ip还是可以获取的。

  1. /**
  2.  * 获得用户的真实IP地址
  3.  *
  4.  * @access  public
  5.  * @return  string
  6.  */
  7. function real_ip()
  8. {
  9.     static $realip = NULL;
  10.  
  11.     if ($realip !== NULL)
  12.     {
  13.         return $realip;
  14.     }
  15.  
  16.     if (isset($_SERVER))
  17.     {
  18.         if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  19.         {
  20.             $arr =explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
  21.  
  22.             /* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */
  23.             foreach ($arr AS$ip)
  24.             {
  25.                 $ip = trim($ip);
  26.  
  27.                 if ($ip !='unknown')
  28.                 {
  29.                     $realip =$ip;
  30.  
  31.                     break;
  32.                 }
  33.             }
  34.         }
  35.         elseif (isset($_SERVER['HTTP_CLIENT_IP']))
  36.         {
  37.             $realip =$_SERVER['HTTP_CLIENT_IP'];
  38.         }
  39.         else
  40.         {
  41.             if (isset($_SERVER['REMOTE_ADDR']))
  42.             {
  43.                 $realip =$_SERVER['REMOTE_ADDR'];
  44.             }
  45.             else
  46.             {
  47.                 $realip ='0.0.0.0';
  48.             }
  49.         }
  50.     }
  51.     else
  52.     {
  53.         if (getenv('HTTP_X_FORWARDED_FOR'))
  54.         {
  55.             $realip =getenv('HTTP_X_FORWARDED_FOR');
  56.         }
  57.         elseif (getenv('HTTP_CLIENT_IP'))
  58.         {
  59.             $realip =getenv('HTTP_CLIENT_IP');
  60.         }
  61.         else
  62.         {
  63.             $realip =getenv('REMOTE_ADDR');
  64.         }
  65.     }
  66.  
  67.     preg_match("/[d.]{7,15}/",$realip,$onlineip);
  68.     $realip = !empty($onlineip[0]) ?$onlineip[0] :'0.0.0.0';
  69.  
  70.     return $realip;
  71. }
标签:代理 ip