首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 取得客戶端真實 IP 地址的多種方法整理

     編輯:PHP 綜合知識

因代理、負載平衡等原因,$_SERVER['REMOTE_ADDR'] 不一定是真實客戶 IP。本文整理多種取得真實 IP 的寫法。

常見 Header 來源

  • HTTP_X_FORWARDED_FOR(可能包含多個 IP,第一個通常為真實)
  • HTTP_CLIENT_IP
  • REMOTE_ADDR(最後防線)

函式版本 1:簡易判斷

function get_real_ip(){
    $ip = false;
    if(!empty($_SERVER["HTTP_CLIENT_IP"])) $ip = $_SERVER["HTTP_CLIENT_IP"];
    if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
        $ips = explode(", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
        if($ip) array_unshift($ips, $ip);
        foreach($ips as $v){
            if(!preg_match("/^(10|172\.16|192\.168)\./", $v)){ $ip=$v; break; }
        }
    }
    return $ip ?: $_SERVER['REMOTE_ADDR'];
}

函式版本 2:相容舊版全域變數

if($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]) $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
elseif($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]) $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
elseif($HTTP_SERVER_VARS["REMOTE_ADDR"]) $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
elseif(getenv("HTTP_X_FORWARDED_FOR")) $ip = getenv("HTTP_X_FORWARDED_FOR");
elseif(getenv("HTTP_CLIENT_IP")) $ip = getenv("HTTP_CLIENT_IP");
elseif(getenv("REMOTE_ADDR")) $ip = getenv("REMOTE_ADDR");
else $ip = "Unknown";

函式版本 3:簡潔 @ 抑制錯誤

function getIP(){
    if(@$_SERVER["HTTP_X_FORWARDED_FOR"]) return $_SERVER["HTTP_X_FORWARDED_FOR"];
    if(@$_SERVER["HTTP_CLIENT_IP"]) return $_SERVER["HTTP_CLIENT_IP"];
    if(@$_SERVER["REMOTE_ADDR"]) return $_SERVER["REMOTE_ADDR"];
    if(@getenv("HTTP_X_FORWARDED_FOR")) return getenv("HTTP_X_FORWARDED_FOR");
    if(@getenv("HTTP_CLIENT_IP")) return getenv("HTTP_CLIENT_IP");
    if(@getenv("REMOTE_ADDR")) return getenv("REMOTE_ADDR");
    return "Unknown";
}

補充:取得主機名對應 IP

echo gethostbyname("www.baidu.com"); // 61.135.169.105
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved