PHP的全局函數$_SERVER可以簡單的獲取到客戶機的IP地址,但是存在代理或者ip偽裝的時候,使用全局變量就會導致獲取到的不是真是的Ip地址,要想獲取到真實的ip,這是要話費一番功夫的
下面的函數,可以獲取真實的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);
這一套代碼在ThinkPHP 3.2.3中,有此函數.
函數:getenv()獲取:Gets the value of an environment variable. 獲取環境變量值.
函數:strcasecmp() :strcasecmp — Binary safe case-insensitive string comparison :比較字符串,不區分大小寫.string1==string2 返回0 string1>string2 返回大於0的數,string1<string2 返回小於0的數
關於最后對於$_SERVER的判斷,那是因為:$_SERVER是服務器超級全局變量數組,用$_SERVER['REMOTE_ADDR']同樣可以獲取到客戶端的IP地址.二者的區別在於,getenv不支持IIS的isapi方式運行的php.
REMOTE_ADDR 是你的客戶端跟你的服務器握手時候的ip,如果使用匿名代理,將顯示代理服務器的的ip
HTTP_CLIENT_IP :是代理服務器i發送的HTTP頭,如果是超級匿名代理,則返回none;REMOTE_ADD 也會被替換為這個代理服務器i的ip