您好,登錄后才能下訂單哦!
PHP中怎么獲取客戶端IP,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
一、沒有使用代理服務器的PHP獲取客戶端IP情況:
REMOTE_ADDR = 客戶端IP
HTTP_X_FORWARDED_FOR = 沒數值或不顯示
二、使用透明代理服務器的情況:Transparent Proxies
REMOTE_ADDR = ***一個代理服務器 IP
HTTP_X_FORWARDED_FOR = 客戶端真實 IP (經過多個代理服務器時,這個值類似:221.5.252.160, 203.98.182.163, 203.129.72.215)
這類代理服務器還是將客戶端真實的IP發送給了訪問對象,無法達到隱藏真實身份的目的。
三、使用普通匿名代理服務器的PHP獲取客戶端IP情況:Anonymous Proxies
REMOTE_ADDR = ***一個代理服務器 IP
HTTP_X_FORWARDED_FOR = 代理服務器 IP (經過多個代理服務器時,這個值類似:203.98.182.163, 203.98.182.163, 203.129.72.215)
這種情況下隱藏了客戶端的真實IP,但是向訪問對象透露了客戶端是使用代理服務器訪問它們的。
四、使用欺騙性代理服務器的情況:Distorting Proxies
REMOTE_ADDR = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 隨機的 IP(經過多個代理服務器時,這個值類似:220.4.251.159, 203.98.182.163, 203.129.72.215)
這種情況下同樣透露了客戶端是使用了代理服務器,但編造了一個虛假的隨機IP(220.4.251.159)代替客戶端的真實IP來欺騙它。
五、使用高匿名代理服務器的PHP獲取客戶端IP情況:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 沒數值或不顯示
無論是REMOTE_ADDR還是HTTP_FORWARDED_FOR,這些頭消息未必能夠取得到,因為不同的瀏覽器不同的網絡設備可能發送不同的IP頭消息。因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 獲取的值可能是空值也可能是“unknown”值。
因此,使用PHP獲取客戶端IP的代碼可以如下:
function getip() {
$unknown = 'unknown';
if ( isset($_SERVER['HTTP_X_FORWARDED_FOR'])
&& $_SERVER['HTTP_X_FORWARDED_FOR']
&& strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'],
$unknown) ) {$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif ( isset($_SERVER['REMOTE_ADDR'])
&& $_SERVER['REMOTE_ADDR'] &&
strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) {$ip = $_SERVER['REMOTE_ADDR'];
}
/*
處理多層代理的情況
或者使用正則方式:$ip = preg_match("/[\d\.]
{7,15}/", $ip, $matches) ? $matches[0] : $unknown;*/
if (false !== strpos($ip, ','))
$ip = reset(explode(',', $ip));
return $ip;
}
PHP獲取客戶端IP時另外一點需注意,使用函數getenv(’HTTP_X_FORWARDED_FOR’)或getenv(’REMOTE_ADDR’) 也可以如上代碼一樣取得同樣的效果。但getenv()不支持在IIS的isapi方式下運行的PHP。
關于PHP中怎么獲取客戶端IP問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。