2010-08-10 246 views
4

我試圖讓客戶端瀏覽器使用 $_SERVER['REMOTE_ADDR']該網站的IP地址,但我沒有收到客戶端 請幫我的確切IP ...感謝如何獲取客戶端IP地址

+2

其實這是做它的方式。 「不是確切的IP」是什麼意思? – JochenJung 2010-08-10 11:45:07

+0

你從REMOTE_ADDR得到什麼? – fabrik 2010-08-10 11:45:54

+3

我suspsect你從路由器得到的外部IP地址 - 而不是你期望的機器查看該網站的內部IP地址 – Alex 2010-08-10 11:46:22

回答

5
$_SERVER['REMOTE_ADDR'] 

是最好的,你會得到真正的。

存在可以由客戶機發送的各種其它標題(​​HTTP_FORWARDED_FOR等人) - 見this question爲完整的概述 - 但這些可以是由客戶端自由地操縱,並且被視爲可靠。

+0

感謝您的幫助.. – user389055 2010-08-10 12:39:41

1

服務器看到的IP地址是客戶端的面向公衆的IP地址。如果他們在NAT路由器後面,他們將在他們的網絡中有不同的地址。

如果您在客戶端計算機上運行ipconfig(Windows)或ifconfig(Unix-y系統),您將獲得其本地IP地址。如果它位於192.168.x.x或10.x.x.x範圍內,則它們位於NAT路由器後面,互聯網將看到它們來自不同的地址。

+0

感謝您的幫助.. – user389055 2010-08-10 12:40:10

1

如果用戶在代理後面,您將獲得代理的IP。用戶IP是那麼無論其中一個(你需要同時檢查): $ _ SERVER [「HTTP_CLIENT_IP」] $ _ SERVER [「HTTP_X_FORWARDED_FOR」]

如果其中的任何設置,然後用戶在代理之後(除非他僞造這些頭文件),你應該使用它們作爲源IP。 否則使用$ _SERVER ['REMOTE_ADDR']。

+0

感謝您的幫助.. – user389055 2010-08-10 12:38:40

3

//獲取真正的客戶端IP

function getIP() { 
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) { 
     $ip = getenv("HTTP_CLIENT_IP"); 
    } else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) { 
     $ip = getenv("HTTP_X_FORWARDED_FOR"); 
    } else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) { 
     $ip = getenv("REMOTE_ADDR"); 
    } else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) { 
     $ip = $_SERVER['REMOTE_ADDR']; 
    } else { 
     $ip = "unknown"; 
    } 
    return($ip); 
} 
相關問題