2013-01-09 50 views
0

我一直在嘗試獲取LAN中連接的計算機的客戶端IP地址,如果我使用getenv('REMOTE_ADDR')或$ _SERVER ['REMOTE_ADDR']它返回不同的IP似乎它獲得了計算機使用的瀏覽器的代理地址,當我嘗試getenv('HTTP_X_FORWARDED_FOR')時,它不會返回任何內容,並且$ _SERVER ['HTTP_X_FORWARDED_FOR']有一個未定義索引的錯誤。我嘗試了所有可能的代碼,我發現在獲得真正的IP地址,但沒有任何工作。請幫忙。在PHP中getenv('HTTP_X_FORWARDED_FOR')在任何情況下都不會返回

+1

其可選的頭,你使用Wireshark的/小提琴手等來首先驗證它在請求中的存在? –

+0

如果'print_r($ _ SERVER)'沒有顯示你之後的IP地址,那麼服務器就沒有這條信息。 –

+0

它不存在於$ _SERVER數組中它是否與我的php.ini或xampp的配置文件有關? –

回答

0

客戶端HTTP代理的預期用途之一是可以隱藏組織的內部拓撲。

如果您控制代理,您可以將其設置爲可靠地報告標題中的原始IP地址,但不能保證其他人會這樣做。

由於隱藏拓撲的能力在HTTP中是有意的,所以您必須訴諸於「惡意」的做法,如簽名的applet,activeX控件或其他執行方法放鬆的安全性。

0

這裏是一個短,更清潔的方式來獲得準確的IP地址:

function get_ip_address(){ 
    foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key){ 
     if (array_key_exists($key, $_SERVER) === true){ 
      foreach (explode(',', $_SERVER[$key]) as $ip){ 
       $ip = trim($ip); // just to be safe 

       if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){ 
        return $ip; 
       } 
      } 
     } 
    } 
} 

它的工作很好..

相關問題