php無法獲取真實ip

2020-07-16 10:05:44

一、獲取使用者真實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其它相關文章!