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

PHP 取得用戶真實 IP 並整合淘寶 IP 庫查詢地理位置(免維護資料庫)

     編輯:PHP 相關知識

在反向代理、CDN、負載均衡等架構下,$_SERVER['REMOTE_ADDR'] 往往只能拿到代理伺服器 IP。本文提供一個健全的 getIP() 函數,支援多層代理標頭判斷,並整合淘寶免費 IP 定位 API(HTTP 介面,無需本地資料庫),即時取得國家、省份、城市、ISP 等資訊。

1. 取得真實客戶端 IP

function getIP() {
    static $realip;
    if (isset($_SERVER)) {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            // 可能包含多個 IP,取第一個非私有 IP
            $proxies = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            foreach ($proxies as $ip) {
                $ip = trim($ip);
                if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) continue;
                $realip = $ip;
                break;
            }
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $realip = $_SERVER['HTTP_CLIENT_IP'];
        } else {
            $realip = $_SERVER['REMOTE_ADDR'];
        }
    } else {
        // 老式 CGI 環境 fallback
        $realip = getenv('HTTP_X_FORWARDED_FOR') ?: getenv('HTTP_CLIENT_IP') ?: getenv('REMOTE_ADDR');
    }
    return $realip ?: '0.0.0.0';
}

2. 呼叫淘寶 IP API 取得地理位置

介面:https://ip.taobao.com/service/getIpInfo.php?ip=IP,回傳 JSON,欄位包含 country、region、city、isp、area_id 等。

function getCity($ip) {
    $url = 'https://ip.taobao.com/service/getIpInfo.php?ip=' . urlencode($ip);
    $json = @file_get_contents($url);
    if (!$json) return false;
    $data = json_decode($json, true);
    if (($data['code'] ?? 1) != 0) return false; // code=0 成功
    return $data['data'] ?? false; // 回傳關聯陣列
}

// 使用範例
$ip = getIP();
$loc = getCity($ip);
if ($loc) {
    echo "{$loc['country']} {$loc['region']} {$loc['city']} {$loc['isp']}";
    // 輸出:中國 廣東 廣州 電信
} else {
    echo '無法解析位置';
}

3. 注意事項與優化

  • 頻率限制:淘寶介面有 QPS 限制,生產環境建議快取結果(Redis/Memcached)或自建離線 IP 庫。
  • HTTPS:新版 API 支援 https://ip.taobao.com/,建議改用 HTTPS 避免劫持。
  • 私有 IP:內網 IP(10.x, 172.16-31.x, 192.168.x)無法定位,需在 getIP() 已過濾。
  • 錯誤處理:file_get_contents 失敗時回傳 false,配合 @ 抑制警告,生產環境建議改用 cURL 並設定超時。

4. cURL 版本(生產推薦)

function getCityCurl($ip) {
    $url = 'https://ip.taobao.com/service/getIpInfo.php?ip=' . urlencode($ip);
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 2,
        CURLOPT_SSL_VERIFYPEER => false, // 若憑證驗證失敗可關閉
    ]);
    $json = curl_exec($ch);
    curl_close($ch);
    if (!$json) return false;
    $data = json_decode($json, true);
    return ($data['code'] ?? 1) == 0 ? $data['data'] : false;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved