HTTP 重新導向完整教學

目錄

什麼是 HTTP 重新導向?

HTTP 重新導向(URL 重新導向)是一種自動將使用者從一個網址導向另一個網址的機制。當您請求一個頁面時,伺服器可能會回應 3xx 狀態碼和 Location 標頭,指向新的位址 — 瀏覽器會自動跟隨該位址。

重新導向用於許多常見場景:

重新導向的運作方式

客戶端請求:
GET /old-page HTTP/1.1
Host: example.com

伺服器回應:
HTTP/1.1 301 Moved Permanently
Location: https://example.com/new-page

重新導向類型詳解

301 Moved Permanently

301 是最常見的重新導向類型。它告訴客戶端和搜尋引擎,資源已永久移至新網址。

✅ 何時使用 301

  • 永久網域遷移
  • 永久網址結構調整
  • HTTP → HTTPS 升級
  • 合併重複內容

SEO:搜尋引擎會將連結權重(PageRank)轉移到新網址並更新索引。Google 通常在幾週內完成此過程。

瀏覽器行為:瀏覽器可能會快取 301 重新導向,在後續造訪時跳過原始網址。

302 Found(暫時)

302 表示暫時移動。原始網址仍然有效且被索引。

✅ 何時使用 302

  • 維護頁面
  • A/B 測試
  • 基於地理位置的暫時路由
  • 短期行動/桌面版本分流

303 See Other

303 強制客戶端使用 GET 方法進行重新導向請求,無論原始方法為何。主要用於 POST 提交後,防止使用者重新整理時重複提交表單(Post/Redirect/Get 模式)。

307 Temporary Redirect

307 類似 302,但嚴格保留原始請求方法。POST 請求在重新導向後仍然是 POST — 不像 302 在歷史上允許方法變更。

308 Permanent Redirect

308 是 301 的方法保留版本。對於 GET 請求,301 和 308 的行為完全相同。當您需要永久重新導向且不能改變請求方法時,使用 308。

客戶端重新導向

Meta refresh

<meta http-equiv="refresh" content="0; url=https://example.com/new-page">

不建議用於 SEO — 搜尋引擎可能無法正確處理。

JavaScript 重新導向

window.location.href = "https://example.com/new-page";

對 SEO 不理想,因為爬蟲可能不會執行 JavaScript。

⚠️ 客戶端重新導向的限制

客戶端重新導向不帶有 HTTP 狀態碼,因此搜尋引擎無法判斷移動是永久的還是暫時的。請優先使用伺服器端重新導向。

何時使用哪種重新導向

SEO 影響

連結權重轉移

301 重新導向會將幾乎所有連結權重轉移到新網址。Google 曾表示 301 會轉移接近 100% 的 PageRank。302 不會轉移權重 — 原始網址保留其排名訊號。

索引更新時程

設定 301 後,Google 通常會:

重新導向鏈路的影響

鏈路中每增加一跳(A → B → C)都會增加延遲,並可能稀釋權重。Google 最多追蹤約 10 跳,但超過 3 跳的鏈路就是警訊。請務必從原始網址直接重新導向到最終目的地。

🎯 最佳實務

使用直接重新導向(A → C)。定期稽核您的鏈路,盡可能縮短它們。

常見問題與解決方案

1. 重新導向迴圈

症狀:瀏覽器顯示「重新導向次數過多」。

常見原因:CDN 和來源伺服器之間的 HTTPS 設定衝突、WordPress 的 siteurl 設定錯誤、Nginx/Apache 重寫規則互相衝突、.htaccess 設定錯誤。

# 使用 curl 診斷
curl -I -L https://example.com

或使用 301check.com 視覺化完整鏈路。

2. 查詢字串遺失

確保您的重新導向規則保留查詢參數。在 Nginx 中,使用 $request_uri$is_args$args

3. 快取的 301

瀏覽器會快取 301 重新導向。如果您變更了重新導向,使用者可能仍然看到舊的目的地。請在無痕視窗中測試或清除快取。

4. 行動裝置重新導向不匹配

如果行動裝置使用者被重新導向到首頁而非對應的行動版頁面,請修正網址對應或改用響應式設計。

最佳實務