複製代碼 代碼如下: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);
}
regist=off的問題
if ($register_globals!=1) {
@extract($_SERVER, EXTR_SKIP);
@extract($_COOKIE, EXTR_SKIP);
@extract($_SESSION, EXTR_SKIP);
@extract($_POST, EXTR_SKIP);
@extract($_FILES, EXTR_SKIP);
@extract($_GET, EXTR_SKIP);
@extract($_ENV, EXTR_SKIP);
}
其中REMOTE_ADDR比較好理解,php手冊上有說明它是預定的變數;而HTTP_x_FORWARDED_FOR呢,在網上找了一些資料,是這麼說的
在PHP 中使用 $_SERVER["REMOTE_ADDR"] 來取得用戶端的 IP 位址,但如果用戶端是使用Proxy 伺服器來訪問,那取到的就是Proxy 伺服器的 IP 位址,而不是真正的用戶端 IP 位址。要想透過Proxy 伺服器取得用戶端的真實 IP 位址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 來讀取。
不過要注意的事,並不是每個Proxy 伺服器都能用 $_SERVER["HTTP_X_FORWARDED_FOR"] 來讀取用戶端的真實 IP,有些用此方法讀取到的仍然是Proxy 伺服器的 IP。
至於HTTP_CLIENT_IP,有篇貼子上說
'HTTP_CLIENT_IP'是使用者的IP,'HTTP_X_FORWARDED_FOR'是代理的IP
這些IP頭訊息未必能夠取得到(因為不同的瀏覽器不同的網路裝置,可能發不同的IP頭訊息).所以PHP就嘗試把每個IP頭訊息判斷一下,若有,則取其中的一個.