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

PHP 實現 IP 地址歸屬地查詢完整程式碼教學

     編輯:PHP 相關知識

專案概述

本文提供一套完整的 PHP IP 歸屬地查詢解決方案,整合了前端表單驗證、後端邏輯處理、淘寶 IP 庫 API 串接以及偽靜態配置。適用於需要快速部署 IP 查詢功能的專案。

核心架構設計

1. 前端交互與驗證

包含一個支援 IP 與域名雙模式輸入的表單,採用 JavaScript 進行即時格式校驗:

  • IP 格式:四段數字,每段 0-255
  • 域名格式:支援主流頂級域名後綴
  • 自動將域名解析為 IP 再查詢

2. 後端核心邏輯 (核心函數解析)

獲取真實客戶端 IP

function get_real_ip() {
    // 依序檢查代理頭部,防止偽造
    if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $ip = getenv('REMOTE_ADDR');
    } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    // 正則提取純 IP
    return preg_match('/[\d.]{7,15}/', $ip, $matches) ? $matches[0] : false;
}

IP 格式驗證

function is_ip($str) {
    $ip = explode(".", $str);
    if (count($ip) != 4) return false;
    foreach ($ip as $seg) {
        if (!is_numeric($seg) || $seg < 0 || $seg > 255) return false;
    }
    return true;
}

淘寶 IP 庫 API 串接 (SaeFetchurl 適配 SAE 環境)

function ipdata($ip, $name = "0") {
    $url = "https://ip.taobao.com/service/getIpInfo.php?ip=" . $ip;
    // 使用 SAE 專用 fetchurl
    $f = new SaeFetchurl();
    $content = $f->fetch($url);
    if ($f->errno() != 0) return false;
    
    $data = json_decode($content);
    if ($data->code != 0) return false; // API 返回錯誤
    
    $ipdata = $data->data;
    // 根據參數返回不同粒度資訊
    switch ($name) {
        case "all": return $ipdata;
        case "0": return $ipdata->country . $ipdata->region . $ipdata->city . $ipdata->isp;
        case "1": return $ipdata->country;
        case "3": return $ipdata->region;
        case "4": return $ipdata->city;
        case "6": return $ipdata->isp;
        default: return $ipdata->country;
    }
}

淘寶 IP API 回傳數據結構說明

{
  "code": 0,  // 0:成功 1:失敗
  "data": {
    "ip": "210.75.225.254",
    "country": "中國",
    "area": "華北",
    "region": "北京市",
    "city": "北京市",
    "county": "",
    "isp": "電信",
    "country_id": "86",
    "area_id": "100000",
    "region_id": "110000",
    "city_id": "110000",
    "county_id": "-1",
    "isp_id": "100017"
  }
}

偽靜態規則配置

Apache (.htaccess)

RewriteEngine on
RewriteRule ^(.*)$ index.php?id=$1 [L]

SAE (config.yaml)

- rewrite: if (!is_dir() && !is_file() && path ~ "/(.*)" ) goto "index.php?$1"

安全與優化建議

  1. 緩存機制: 高頻查詢建議引入 Redis/Memcached 緩存 API 結果,減少外部請求延遲。
  2. 異常處理: API 失敗時提供降級策略(如返回本地離線庫結果)。
  3. HTTPS 遷移: 淘寶 IP 接口已支援 HTTPS,生產環境請務必升級協議。
  4. 輸入過濾: 雖有前端驗證,後端必須再次嚴格校驗 is_ip(),防繞過攻擊。

總結

本方案提供了從前端到後端、從開發環境到生產部署的完整鏈路。核心價值在於封裝了穩健的 IP 獲取邏輯、標準化的 API 適配層以及靈活的結果輸出介面,開發者可直接整合至現有專案或作為微服務獨立部署。

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