2011-05-07 87 views
1

我使用下面的代碼來獲取用戶的真實IP地址。如何在PHP中獲取用戶的IP地址?

function getUserIP() { 

    if (getenv('HTTP_CLIENT_IP')) { 

     $ip = getenv('HTTP_CLIENT_IP'); 

    } 

    elseif (getenv('HTTP_X_FORWARDED_FOR')) { 

     $ip = getenv('HTTP_X_FORWARDED_FOR'); 

    } 

    elseif (getenv('HTTP_X_FORWARDED')) { 

     $ip = getenv('HTTP_X_FORWARDED'); 

    } 

    elseif (getenv('HTTP_FORWARDED_FOR')) { 

     $ip = getenv('HTTP_FORWARDED_FOR'); 

    } 

    elseif (getenv('HTTP_FORWARDED')) { 

     $ip = getenv('HTTP_FORWARDED'); 

    } 

    else { 

     $ip = $_SERVER['REMOTE_ADDR']; 

    } 

    return $ip; 

} 

$userIP = getUserIP(); 

有時我得到的IP地址是67.143.220.112, 67.142.171.26

這是用戶的正確IP地址還是必須做別的事情才能獲得用戶的真實IP地址?

+0

使用$ _ SERVER [ 'REMOTE_ADDR']另外,可我建議清晰度[轉](http://php.net/manual/en/control-structures.switch.php)? – 2011-05-07 05:25:53

+0

你的方式似乎很好。有關更詳細的博客討論:http://www.scriptygoddess.com/archives/2003/03/18/get-users-ip-with-php/ – Spyros 2011-05-07 04:48:06

回答

4

$_SERVER['REMOTE_ADDR'];給出用戶的IP地址。

+0

+1,我也更喜歡這個。 – 0xAli 2011-05-07 05:07:14

+1

它只給出了發起到服務器的TCP連接的機器的地址,可能不是用戶的實際地址。 – 2011-05-07 05:21:14

1

您可以得到的唯一100%可靠的地址是$_SERVER['REMOTE_ADDR']。其他頭文件是可選的,並不總是存在的,並且是簡單僞造的,因爲它們只是信息性的。

即使是REMOTE_ADDR,如果用戶位於一個或多個代理和/或NAT網關後面,則會出錯。簡而言之,不管代理/ NAT是什麼,都不可能完全識別用戶的真實IP地址。

2

獲取用戶IP地址的完美方法。

<?PHP 

function getUserIP() 
{ 
    $client = @$_SERVER['HTTP_CLIENT_IP']; 
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; 
    $remote = $_SERVER['REMOTE_ADDR']; 

    if(filter_var($client, FILTER_VALIDATE_IP)) 
    { 
     $ip = $client; 
    } 
    elseif(filter_var($forward, FILTER_VALIDATE_IP)) 
    { 
     $ip = $forward; 
    } 
    else 
    { 
     $ip = $remote; 
    } 

    return $ip; 
} 


$user_ip = getUserIP(); 

echo $user_ip; // Output User IP address [Ex: 177.87.193.134] 


?>