Skip to content

Cloudflare 轉址循環排查|Redirect Loop

這份排查用在 Cloudflare Pages、Redirect Rules、DNS 或 framework redirect 設定後,瀏覽器出現 ERR_TOO_MANY_REDIRECTS 的情境。

症狀

  • Chrome 顯示 ERR_TOO_MANY_REDIRECTS
  • Safari 顯示頁面重新導向次數過多。
  • curl -I -L 看到 root、www、HTTP、HTTPS 之間來回跳轉。

常見原因

root redirect 到自己

Redirect Rule 條件太寬,target 又指回同一個 host,例如:

https://example.com/* → https://example.com/$1

這會讓每次 request 都重新命中同一條 redirect。

root → www,但 www 又 CNAME 到 root

如果規則設定:

example.com/* → https://www.example.com/$1

但 DNS 裡 www CNAME 指向 root domain,就可能形成:

root → www → root → www

Cloudflare Pages 專案中,www CNAME 應直接指向 Pages project,不要指向 root。

HTTP / HTTPS 規則互相打架

Always Use HTTPS、Page Rules、Redirect Rules、Pages _redirects、framework middleware 同時存在時,可能互相改寫 URL。尤其是某一層導到 HTTPS,另一層又導回 HTTP 或不同 host。

修法

1. 明確設定 Target URL

Target URL 要包含正確 canonical host,例如:

https://www.example.com/${uri.path}

不要讓 target URL 只寫相對路徑,也不要指回同一個 host。

2. 修正 www CNAME

若 canonical 是 www,DNS 應該是:

  • www CNAME → Pages project target,例如 project-name.pages.dev
  • root → 透過 Redirect Rule 301 到 https://www.example.com

不要讓 www CNAME → root。

3. 簡化 redirect 層級

優先把 host redirect 放在 Cloudflare Redirect Rules。Framework 內只處理應用層路由,不要同時做 root / www / HTTPS 收斂。

驗證指令

Redirect loop 排查

追蹤 redirect chain

Expected: 最後停在 canonical URL,且不超過 1 到 2 次 301

Terminal window
curl -I -L https://example.com/
curl -I -L http://example.com/
curl -I -L https://www.example.com/

快速確認是否還在 loop

只看 status 與 final URL

Expected: final URL 是 canonical host

Terminal window
curl -s -o /dev/null -w "%{http_code} %{url_effective}\n" -L https://example.com/

完成標準

Checklist

Redirect Loop 修復檢查

P0

  • root 不會 redirect 到自己。
  • root → www 時,www CNAME 直接指向 Pages project。
  • HTTP / HTTPS / root / www 最後收斂到同一個 canonical URL。
  • curl -I -L 不再無限跳轉。
  • framework middleware 或 _redirects 沒有重複做 host 收斂。