2016-02-10 17 views
1

問題是,我無法在某些共享主機或VPS上獲取訪問者IP。PHP:在共享主機和某些VPS上無法獲得訪問者IP

這裏是我的「強大」的功能:

function get_IP(){ 
    $findIP=array(
     'HTTP_CLIENT_IP', 
     'HTTP_X_FORWARDED_FOR', 
     'HTTP_X_FORWARDED', 
     'HTTP_X_CLUSTER_CLIENT_IP', 
     'HTTP_FORWARDED_FOR', 
     'HTTP_FORWARDED', 
     'REMOTE_ADDR' 
    ); 
    $blacklistIP=array(
     '127.0.0.1', 
     '255.255.255.255', 
    ); 
    $ip = ''; 
    foreach($findIP as $http) 
    { 
     if(function_exists("getenv")) 
     { 
      $ip = getenv($http); 
     } 
     else 
     { 
      if (array_key_exists($http, $_SERVER) !== false){ 
       foreach (explode(',', $_SERVER[$http]) as $findIP){ 
        $ip = trim($findIP); 
       } 
      } 
     } 
     if(function_exists("filter_var") && !empty($ip) && in_array($ip, $blacklistIP)===false) 
     { 
      if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) return $ip; 
     } 
     else if(preg_match('/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/', $ip) && !empty($ip) && in_array($ip, $blacklistIP)===false) 
     { 
      return $ip; 
     } 
    } 
    return '0.0.0.0'; 
} 

此功能工作完全正常的服務器,但一些共享和VPS讓我有很多問題。

某些服務器返回我127.0.0.1和一些服務器上HTTP_CLIENT_IPHTTP_X_FORWARDED_FORHTTP_X_FORWARDEDHTTP_X_CLUSTER_CLIENT_IPHTTP_FORWARDED_FORHTTP_FORWARDEDREMOTE_ADDR回報像空或沒有設置。

我的錯誤在哪裏?錯過了什麼或我能做什麼?謝謝!

+2

這些服務器是否使用反向代理將流量分散到不同的主機? – TZHX

+0

我真的不知道。我可以檢查。這是我客戶的服務器。 –

+0

@TZHX可能已經擊中了頭部。您很可能會獲取代理服務器的IP地址,而不是客戶端的IP地址。 – Kryten

回答

0

好了,這方面的工作我figureout的問題,我會給你我的問題回答:

/* 
* IP Address Lookup 
* @author Ivijan-Stefan Stipic 
*/ 
function get_IP(){ 
    // check any protocols 
    $findIP=array(
     'HTTP_CLIENT_IP', 
     'HTTP_X_FORWARDED_FOR', 
     'HTTP_X_FORWARDED', 
     'HTTP_X_CLUSTER_CLIENT_IP', 
     'HTTP_FORWARDED_FOR', 
     'HTTP_FORWARDED', 
     'REMOTE_ADDR', 
     'BAN_CHECK_IP', 
     'HTTP_X_FORWARDED_HOST' 
    ); 
    // IP blacklist - you can add array from your database 
    $blacklistIP=array(
     '127.0.0.1', 
     '255.255.255.255', 
    ); 
    $ip = ''; 
    // start looping 
    foreach($findIP as $http) 
    { 
     // Check in $_SERVER 
     if (array_key_exists($http, $_SERVER) !== false){ 
      $ip=$_SERVER[$http]; 
     } 
     // check in getenv() for any case 
     if(empty($ip) && function_exists("getenv")) 
     { 
      $ip = getenv($http); 
     } 
     // Check if here is multiple IP's 
     if(!empty($ip)) 
     { 
      $ips=explode(",",$ip); 
      $ipMAX=count($ips); 
      if($ipMAX>0) 
      { 
       if($ipMAX > 1) 
        $ip=trim(end($ips)); 
       else 
        $ip=trim($ips[0]); 
      } 
     } 
     // Check if IP is real and valid 
     if(function_exists("filter_var") && !empty($ip) && in_array($ip, $blacklistIP)===false && filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) 
     { 
      return $ip; 
     } 
     else if(preg_match('/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/', $ip) && !empty($ip) && in_array($ip, $blacklistIP)===false) 
     { 
      return $ip; 
     } 
    } 
    return '0.0.0.0'; 
} 

的代碼裏面的問題是,有時X代理返回多個IP的逗號分隔有什麼可以做的一個問題。另外一些主機可以是IP,一些禁止的IP地址可以訪問您的網站。我添加了這些規則並提取了一個可以成爲列表的小程序。這給我一個深層的IP地址查詢。

感謝您的幫助和某人-1因爲這迫使我深入挖掘問題並解決。我認爲這是互聯網上最完整的IP地址查詢。