1、若是沒有使用代理服務器,php
REMOTE_ADDR
= 客戶端IP HTTP_X_FORWARDED_FOR
= 沒數值或不顯示nginx
$ip = $_SERVER['REMOTE_ADDR'];
2、使用透明代理,瀏覽器
REMOTE_ADDR
= 最後一個代理服務器 IP HTTP_X_FORWARDED_FOR
= 客戶端真實 IP (通過多個代理服務器時,這個值相似:221.5.252.160, 203.98.182.163, 203.129.72.215)bash
這類代理還會將客戶真實ip發送到請求對象,沒法隱藏真實ip。服務器
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
3、使用普通匿名代理服務器,spa
REMOTE_ADDR
= 最後一個代理服務器 IP HTTP_X_FORWARDED_FOR
= 代理服務器 IP (通過多個代理服務器時,這個值相似:203.98.182.163, 203.98.182.163, 203.129.72.215)代理
這樣就隱藏了客戶端的真實ip,但服務器會知道客戶端是經過代理服務器去訪問的。code
4、使用欺騙性代理服務器,對象
REMOTE_ADDR
= 代理服務器 IP HTTP_X_FORWARDED_FOR
= 隨機的 IP(通過多個代理服務器時,這個值相似:220.4.251.159, 203.98.182.163, 203.129.72.215)blog
服務器能夠識別到時經過代理服務器訪問的,但發送給目標服務器的是虛假ip。
5、使用高匿名代理,
REMOTE_ADDR
= 代理服務器 IP HTTP_X_FORWARDED_FOR
= 沒數值或不顯示
使用這種代理時,不一樣瀏覽器不一樣設備會返回不一樣的ip頭信息,所以PHP使用$_SERVER["REMOTE_ADDR"]
、$_SERVER["HTTP_X_FORWARDED_FOR"]
獲取的值多是空值也多是「unknown
」值。
PHP獲取ip代碼以下:
public function ip() { //strcasecmp 比較兩個字符,不區分大小寫。返回0,>0,<0。 if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } $res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; echo $res; //dump(phpinfo());//全部PHP配置信息 }