因代理、負載平衡等原因,$_SERVER['REMOTE_ADDR'] 不一定是真實客戶 IP。本文整理多種取得真實 IP 的寫法。
HTTP_X_FORWARDED_FOR(可能包含多個 IP,第一個通常為真實)HTTP_CLIENT_IPREMOTE_ADDR(最後防線)function get_real_ip(){
$ip = false;
if(!empty($_SERVER["HTTP_CLIENT_IP"])) $ip = $_SERVER["HTTP_CLIENT_IP"];
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ips = explode(", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
if($ip) array_unshift($ips, $ip);
foreach($ips as $v){
if(!preg_match("/^(10|172\.16|192\.168)\./", $v)){ $ip=$v; break; }
}
}
return $ip ?: $_SERVER['REMOTE_ADDR'];
}
if($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]) $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
elseif($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]) $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
elseif($HTTP_SERVER_VARS["REMOTE_ADDR"]) $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
elseif(getenv("HTTP_X_FORWARDED_FOR")) $ip = getenv("HTTP_X_FORWARDED_FOR");
elseif(getenv("HTTP_CLIENT_IP")) $ip = getenv("HTTP_CLIENT_IP");
elseif(getenv("REMOTE_ADDR")) $ip = getenv("REMOTE_ADDR");
else $ip = "Unknown";
function getIP(){
if(@$_SERVER["HTTP_X_FORWARDED_FOR"]) return $_SERVER["HTTP_X_FORWARDED_FOR"];
if(@$_SERVER["HTTP_CLIENT_IP"]) return $_SERVER["HTTP_CLIENT_IP"];
if(@$_SERVER["REMOTE_ADDR"]) return $_SERVER["REMOTE_ADDR"];
if(@getenv("HTTP_X_FORWARDED_FOR")) return getenv("HTTP_X_FORWARDED_FOR");
if(@getenv("HTTP_CLIENT_IP")) return getenv("HTTP_CLIENT_IP");
if(@getenv("REMOTE_ADDR")) return getenv("REMOTE_ADDR");
return "Unknown";
}
echo gethostbyname("www.baidu.com"); // 61.135.169.105