PHP 獲取客戶端的真實IP地址


  PHP的全局函數$_SERVER可以簡單的獲取到客戶機的IP地址,但是存在代理或者ip偽裝的時候,使用全局變量就會導致獲取到的不是真是的Ip地址,要想獲取到真實的ip,這是要話費一番功夫的

   下面的函數,可以獲取真實的IP地址

    

function getIp(){
   if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
       $ip = getenv("HTTP_CLIENT_IP");
   else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
       $ip = getenv("HTTP_X_FORWARDED_FOR");
  else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
       $ip = getenv("REMOTE_ADDR");
  else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
           $ip = $_SERVER['REMOTE_ADDR'];
       else
           $ip = "unknown";
       return($ip);

  這一套代碼在ThinkPHP 3.2.3中,有此函數.

   函數:getenv()獲取:Gets the value of an environment variable.  獲取環境變量值.

   函數:strcasecmp() :strcasecmp — Binary safe case-insensitive string comparison  :比較字符串,不區分大小寫.string1==string2 返回0 string1>string2 返回大於0的數,string1<string2 返回小於0的數

   關於最后對於$_SERVER的判斷,那是因為:$_SERVER是服務器超級全局變量數組,用$_SERVER['REMOTE_ADDR']同樣可以獲取到客戶端的IP地址.二者的區別在於,getenv不支持IIS的isapi方式運行的php.

   REMOTE_ADDR 是你的客戶端跟你的服務器握手時候的ip,如果使用匿名代理,將顯示代理服務器的的ip

      HTTP_CLIENT_IP :是代理服務器i發送的HTTP頭,如果是超級匿名代理,則返回none;REMOTE_ADD 也會被替換為這個代理服務器i的ip

  

   

 

   

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM