WordPress 依訪客的 IP 所屬國家,自動轉址到指定網址

在 WordPress 中做「依訪客的 IP 所屬國家,自動轉址到指定網址」有三條常見路徑,可依你掌握的權限與技術挑選:

方法 難度 優點 可能限制
A. 外掛 (最省事) ★☆☆ 不必寫程式;後台 UI 設定就能管理規則 若流量大,免費版查詢次數或資料庫精度可能不足
B. functions.php + MaxMind GeoIP ★★☆ 完全本地查詢,速度快、隱私佳;可自訂邏輯 需會 FTP/SSH,上傳 DB 與排程更新
C. 代理層 / CDN (Cloudflare, nginx geoip2) ★★☆ 把判斷寫在邊緣節點,伺服器零負擔 需能調整 DNS/CDN 或伺服器設定

A. 外掛快速解

  1. 安裝外掛

    • 後台 → 外掛 → 安裝外掛,搜尋以下其中一個:

      • IP2Location Redirection
      • Geolocation IP Detection + Redirection
      • GeoRedirects
  2. 匯入資料庫(大部分外掛會幫你下載免費的 GeoLite2 或 IP2Location LITE)。

  3. 設定規則

    • 例:當 Country = “CN” 時 → 301 轉址到 https://cn.example.com
    • 可多國家、多條件(包含/排除路徑)。
  4. 儲存 → 清快取測試。


B. 自行加程式(functions.php 範例)

前提:伺服器可裝 PHP extension geoip2 你放置 MaxMind GeoLite2-Country.mmdb 檔案。

// functions.php

use GeoIp2\Database\Reader;

add_action('init', function() {
    // 只在前台執行,排除 wp-admin
    if (is_admin()) return;

    // 要排除自己測試用 IP 時可先 if( $_SERVER['REMOTE_ADDR']=='xx.xx.xx.xx') return;

    // 讀取 MaxMind 本地資料庫
    $reader = new Reader(__DIR__ . '/geolite/GeoLite2-Country.mmdb');
    $record = $reader->country($_SERVER['REMOTE_ADDR']);

    $country = $record->country->isoCode; // 兩碼國碼,例如 CN、US

    // 若在中國 → 導向
    if ($country === 'CN') {
        wp_redirect('https://cn.example.com', 301);
        exit;
    }
});
  • 資料庫更新:註冊 MaxMind 帳號後可取得下載連結;用 wget + cron job 每週自動覆蓋即可。
  • 效能:本地 look-up <1 ms,不會明顯拖慢 TTFB。

C. CDN/伺服器層

1. Cloudflare Workers(免寫伺服器程式)

export default {
  async fetch(request, env, ctx) {
    const country = request.headers.get('cf-ipcountry'); // 由 CF 自動注入

    if (country === 'CN') {
      return Response.redirect('https://cn.example.com' + new URL(request.url).pathname, 301);
    }
    return fetch(request);
  }
}
  • 將 Workers 綁到主網域 (Route: example.com/*) 即可。
  • 不消耗 WordPress/PHP 資源。

2. Nginx + geoip2 module

geoip2 /etc/nginx/GeoLite2-Country.mmdb {
    auto_reload 60m;
    $geoip2_data_country_code country iso_code;
}

map $geoip2_data_country_code $redirect_cn {
    default 0;
    CN      1;
}

server {
    location / {
        if ($redirect_cn) {
           return 301 https://cn.example.com$request_uri;
        }
        try_files $uri $uri/ /index.php?$args;
    }
}

常見注意事項

  1. 多語系 SEO

    • 若僅因合規/分支站需求才轉址,建議用 301
    • 若只是語言建議,可用 302 或 Accept-Language + banner 提示,避免搜尋引擎被硬轉。
  2. 快取:確保 CDN/WebServer 依 IP 做分割快取,或用 Edge Function 先判斷再取快取。

  3. GDPR / 隱私:本地資料庫優於即時 API,可避免傳輸使用者 IP 給第三方。

  4. 測試:用 VPN / Proxy / cURL 加 --header "X-Forwarded-For: 1.2.3.4" 模擬不同國家。


結論

  • 想快速上手 → 安裝外掛,三分鐘搞定。
  • 追求輕量可控 → functions.php + MaxMind
  • 已用 Cloudflare 或自己管 nginx → 寫 Workers/伺服器規則 將邏輯搬到邊緣。

選擇最符合你現有架構與維運能力的方案即可。若需要範例程式或伺服器設定檔的完整版本,再告訴我!