首頁  >  文章  >  後端開發  >  php無法取得真實ip

php無法取得真實ip

王林
王林原創
2019-09-29 17:46:244066瀏覽

php無法取得真實ip

一、取得使用者真實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的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn