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