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

PHP 取得客戶端 IP 並查詢地理位置資訊

     編輯:PHP 綜合知識

實務上需考慮 Proxy、CDN、Load Balancer 等導致 $_SERVER['REMOTE_ADDR'] 非真實客戶端 IP。本文提供完整 getClientIp() 與串接淘寶 IP 庫 getIpInfo()。

取得真實 IP 函數

function getClientIp($type = 0) {
    $ip = null;
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $pos = array_search('unknown', $arr);
        if ($pos !== false) unset($arr[$pos]);
        $ip = trim($arr[0]);
    } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (isset($_SERVER['REMOTE_ADDR'])) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    $long = sprintf("%u", ip2long($ip));
    return $type ? $long : $ip;
}

查詢 IP 地理資訊(淘寶介面)

function getIpInfo($ip) {
    if (is_int($ip)) $ip = long2ip($ip);
    $api = 'https://ip.taobao.com/service/getIpInfo.php';
    $json = @file_get_contents($api . '?ip=' . $ip);
    if (!$json) return [];
    $data = json_decode($json, true);
    return ($data['code'] ?? 1) === 0 ? $data['data'] : [];
}

回傳資料結構

Array
(
    [country] => 中國
    [region] => 廣東
    [city] => 深圳
    [isp] => 電信
    [area_id] => 440300
    ...
)

使用範例

$ip = getClientIp();
$info = getIpInfo($ip);
echo "訪客 IP: $ip\n";
echo "所在地: {$info['country']} {$info['region']} {$info['city']} {$info['isp']}\n";

現代替代方案

  • ip-api.com:免費、支援 HTTPS、JSON 格式、限流合理
  • MaxMind GeoIP2:離線資料庫、企業級精準、需授權
  • Cloudflare/CloudFront Header:CDN 直接提供 CF-Connecting-IP 等標頭

安全提醒

  • HTTP_X_FORWARDED_FOR 可偽造,關鍵業務(登入、風控)請配合裝置指紋、行為分析
  • 淘寶介面為 HTTP 非 HTTPS,傳輸可被竄改;生產環境請用 HTTPS 介面
  • 頻繁查詢建議本地快取(Redis/Memcached)

完整 IP 解析方案 = 正確取 IP + 可靠查詢源 + 快取 + 風控邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved