在Thinkphp3.2.3框架下實現自動獲取客戶端IP地址的get_client_ip()函數


在Thinkphp框架下使用get_client_ip()函數獲取客戶端IP地址十分方便;

一行代碼便可以實現:$ip = get_client_ip();

但當我們測試時會遇到后台獲取的IP地址顯示的是局域網內的IP地址,而不是用戶客戶端真正的IP地址;

解決此問題辦法如下:(此方法是在官方thinkphp討論區大牛分享的http://www.thinkphp.cn/code/433.html

修改位置:根項目\ThinkPHP\Common\funcitons.php->get_client_ip()

原代碼:

修改成如下代碼:

function get_client_ip($type = 0) {
    $type       =  $type ? 1 : 0;
    static $ip  =   NULL;
    if ($ip !== NULL) return $ip[$type];
    if($_SERVER['HTTP_X_REAL_IP']){//nginx 代理模式下,獲取客戶端真實IP
        $ip=$_SERVER['HTTP_X_REAL_IP'];     
    }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {//客戶端的ip
        $ip     =   $_SERVER['HTTP_CLIENT_IP'];
    }elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {//瀏覽當前頁面的用戶計算機的網關
        $arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $pos    =   array_search('unknown',$arr);
        if(false !== $pos) unset($arr[$pos]);
        $ip     =   trim($arr[0]);
    }elseif (isset($_SERVER['REMOTE_ADDR'])) {
        $ip     =   $_SERVER['REMOTE_ADDR'];//瀏覽當前頁面的用戶計算機的ip地址
    }else{
        $ip=$_SERVER['REMOTE_ADDR'];
    }
    // IP地址合法驗證
    $long = sprintf("%u",ip2long($ip));
    $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
    return $ip[$type];
}

保存,測試,成功獲取客戶端IP地址;

 


免責聲明!

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



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