PHP获取客户端ip地址

2018-03-25 17:59:43
function getclientip() {
    static $realip = NULL;

    if($realip !== NULL){
        return $realip;
    }
    if(isset($_SERVER)){
         if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){ 
        //但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。
            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            /* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */
            foreach ($arr AS $ip){
                $ip = trim($ip);
                if ($ip != 'unknown'){
                    $realip = $ip;
                    break;
                }
            }
   }elseif(isset($_SERVER['HTTP_CLIENT_IP'])){//HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是"超级匿名代理",则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。
                  $realip = $_SERVER['HTTP_CLIENT_IP'];
              }else{
                  if (isset($_SERVER['REMOTE_ADDR'])){ //正在浏览当前页面用户的 IP 地址
                      $realip = $_SERVER['REMOTE_ADDR'];
                  }else{
                      $realip = '0.0.0.0';
                  }
              }
          }else{
              //getenv<a href="https://www.baidu.com/s?wd=%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y4PhuBPyN9uj6LmvP-m1630ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnHbYPWcLPjfLn1R1rHfdn1czr0" target="_blank" class="baidu-highlight">环境变量</a>的值
              if (getenv('HTTP_X_FORWARDED_FOR')){//但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址
                  $realip = getenv('HTTP_X_FORWARDED_FOR');
              }elseif (getenv('HTTP_CLIENT_IP')){ //获取客户端IP
                  $realip = getenv('HTTP_CLIENT_IP');
              }else{
                  $realip = getenv('REMOTE_ADDR');  //正在浏览当前页面用户的 IP 地址
              }
          }
          preg_match("/[\d\.]{7,15}/", $realip, $onlineip);
          $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';
          return $realip;
   }