一、獲取使用者真實IP地址
public static function getClientIp() { if (getenv('HTTP_CLIENT_IP')) { $ip = getenv('HTTP_CLIENT_IP'); } if (getenv('HTTP_X_REAL_IP')) { $ip = getenv('HTTP_X_REAL_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); $ips = explode(',', $ip); $ip = $ips[0]; } elseif (getenv('REMOTE_ADDR')) { $ip = getenv('REMOTE_ADDR'); } else { $ip = '0.0.0.0'; } return $ip; }
注意:
$_SERVER和getenv的區別,getenv不支援IIS的isapi方式執行的php。getenv(「REMOTE_ADDR」)函數在 apache下能正常獲取ip地址,而在iis中沒有作用,而$_SERVER['REMOTE_ADDR']函數,既可在apache中成功獲取訪客的ip地址,在iis下也同樣有效。
二、關於REMOTE_ADDR
這個變數獲取到的是《直接來源》的 IP 地址,所謂《直接來源》指的是直接請求該地址的用戶端 IP 。這個 IP 在單伺服器的情況下,很準確的是用戶端 IP ,無法偽造。當然並不是所有的程式都一定是單伺服器,比如在採用負載均衡的情況(比如採用 haproxy 或者 nginx 進行負載均衡),這個IP就是轉發機器的IP,因為過程是用戶端->負載均衡->伺服器端。是由負載均衡直接存取的伺服器端而不是用戶端。
三、關於 HTTP_X_FORWARDED_FOR 和 HTTP_CLIENT_IP
在負載均衡的情況下直接使用 REMOTE_ADDR 是無法獲取用戶端 IP 的,這就是一個問題,必須解決。於是就衍生出了負載均衡端將用戶端 IP 加入到 HEAD 中傳送給伺服器端,讓伺服器端可以獲取到用戶端的真實 IP 。當然也就產生了各位所說的偽造,畢竟 HEAD 除了協定裡固定的那幾個資料,其他資料都是可自定義的。
推薦教學:PHP視訊教學
以上就是php無法獲取真實ip的詳細內容,更多請關注TW511.COM其它相關文章!