解決 Cloudflare 301 重定向循環問題:初學者指南
更新日期: 2025 年 3 月 13 日
本文為 HTTPS 連線 基本介紹,第 1 篇:
- 什麼是代管網域(Domain Hosting)?初學者完整指南
- 網站託管(Web Hosting)入門指南:讓你的網站輕鬆上線
- Cloudflare 介紹:讓網站更安全、更快速的關鍵服務
- 反向代理是什麼?初學者必看詳解
- Apache HTTP Server 是什麼:初學者指南
- Django 初學者指南:ALLOWED_HOSTS 設定與安全性考量
- 如何為初學者配置 HTTPS 和 SSL:Cloudflare、Let’s Encrypt 和 Apache 完整指南
- Let’s Encrypt 初學者完全指南
- 虛擬主機(Virtual Host)入門指南:讓你的網站輕鬆上線
- 初學者指南:設定 Apache 反向代理 Django 服務(含 SSL)
- Cloudflare 設定指南:如何正確配置 SSL/TLS 加密模式
- Cloudflare Edge Certificates 入門指南
- 解決 Cloudflare 301 重定向循環問題:初學者指南 👈進度
當你使用 Cloudflare 來保護和加速網站時,可能會遇到 301 重定向循環 的問題,導致你的網站無法正常訪問。
這通常是因為 Cloudflare 的 SSL 模式 與你的伺服器 SSL 設置不匹配所造成的。
本篇文章將詳細說明 為什麼會發生重定向循環,以及如何調整 Apache 伺服器 設置來解決這個問題。
什麼是 301 重定向循環?
了解 301 重定向
301 重定向(Permanent Redirect,永久重定向) 是一種 HTTP 狀態碼,表示某個網址已經永久變更到新的網址。
當用戶或搜尋引擎請求舊網址時,伺服器會回應 301 Moved Permanently,並指示瀏覽器自動跳轉到新的網址。
這對於網站搬遷、變更網址結構、或是強制 HTTPS(HTTP → HTTPS)等情境非常有用。例如:
http://example.com → 301 → https://example.com
這意味著當用戶訪問 http://example.com
時,瀏覽器會自動跳轉到 https://example.com
,並且未來的所有請求都會直接使用 HTTPS。
什麼是重定向循環?
重定向循環(Redirect Loop) 發生在伺服器或網路設備的配置錯誤,導致請求一直在不同的網址之間來回跳轉,最終讓瀏覽器無法載入網站。
例如:
http://example.com → 301 → https://example.com
https://example.com → 301 → http://example.com
(無限循環)
這樣的錯誤可能發生在:
- 伺服器將 HTTP 重定向到 HTTPS,但某些設定又將 HTTPS 重定向回 HTTP。
- Cloudflare 或其他 CDN 使用 Flexible SSL,導致 HTTP 與 HTTPS 之間的錯誤跳轉。
- 伺服器錯誤配置,重複執行相同的 301 重定向規則。
流程示意圖(錯誤情境 – 造成 301 無限重定向)
flowchart LR visitor(訪客) -->|HTTPS| cloudflare1[Cloudflare] cloudflare1 -->|HTTP| apache1[Apache] apache1 -->|301 重定向到 HTTPS| cloudflare1 cloudflare1 -->|HTTP 再次請求| apache1 %% 形成無限循環
為什麼 301 重定向循環會讓網站無法訪問?
當重定向循環發生時,瀏覽器會一直按照伺服器的 301 重定向指示來回跳轉,最終達到瀏覽器的重定向限制(例如 Chrome 允許的最大重定向次數為 20 次)。
當達到這個限制時,瀏覽器會拋出錯誤,例如:
- Chrome:
ERR_TOO_MANY_REDIRECTS
- Firefox:
The page isn't redirecting properly
- Edge:
This page isn’t working
- Safari:
Safari can’t open the page because too many redirects occurred
這種情況下,訪客將無法訪問你的網站,搜尋引擎也可能無法正確索引你的頁面,影響 SEO 表現。
常見的 301 重定向循環情境
- HTTP → HTTPS 循環
- 錯誤示範: Apache 設定將 HTTP 轉向 HTTPS,但 Cloudflare(Flexible SSL)又將 HTTPS 轉回 HTTP。
- 結果: 伺服器與 Cloudflare 之間無限跳轉,導致網站無法載入。
- WWW 與非 WWW 循環
- 錯誤示範:
www.example.com
301 跳轉到example.com
,但example.com
又 301 跳轉回www.example.com
。 - 結果: 瀏覽器不斷來回重定向,導致訪客無法訪問網站。
- 錯誤示範:
- 網址尾端
/
與無/
的循環- 錯誤示範:
example.com/page
301 跳轉到example.com/page/
,但example.com/page/
又 301 跳轉回example.com/page
。 - 結果: 瀏覽器在這兩個網址之間不斷跳轉,最終報錯。
- 錯誤示範:
如何確認網站是否發生 301 重定向循環?
如果你懷疑你的網站出現了重定向循環,可以使用以下方法測試:
- 使用瀏覽器開發者工具(Chrome DevTools)
- 開啟 開發者工具(F12 或 Ctrl + Shift + I)
- 進入 Network(網路) 分頁
- 重新載入網站,查看 HTTP 請求的狀態碼
- 如果發現同一個網址不斷地 301 跳轉,就表示發生了重定向循環。
- 使用
curl
測試- 在終端機輸入:
curl -IL https://你的網站.com
- 如果
Location
標頭顯示多次跳轉,且最終回到原始網址,就表示有重定向循環。
- 在終端機輸入:
- 使用在線工具
- Redirect Checker
- WhereGoes
- 這些工具可以幫助你檢查網站是否發生無限重定向。
為什麼 Cloudflare Flexible SSL 會造成重定向循環?
Cloudflare 提供不同的 SSL 模式,其中 Flexible SSL 可能導致 301 重定向循環,原因如下:
當 Cloudflare 啟用時,它會扮演 反向代理(Reverse Proxy) 的角色,所有請求都必須經過 Cloudflare,再轉發到你的伺服器。
因此,Apache 伺服器只會直接與 Cloudflare 通信,而不會與使用者直接交互。
請求的流向如下:
使用者 → (HTTPS) → Cloudflare → (HTTP 或 HTTPS) → Apache 伺服器
在這個情況下:
當 Apache 伺服器收到 HTTP 請求,如果它的設定是 強制 HTTP → HTTPS 重定向,它會回應瀏覽器或請求端一個 301 Moved Permanently,並提供新的 URL,例如:
HTTP/1.1 301 Moved Permanently
Location: https://example.com
這個訊息的意思是:
「請求的網址應該改成 https://example.com
,請重新發送請求到這個新網址。」
在正常情況下,如果 使用者的瀏覽器 收到這個回應,它會自動發送 新的 HTTPS 請求,因此重定向就成功了。
為什麼 Cloudflare 不會自動轉為 HTTPS?
(1) Cloudflare Flexible SSL 模式的特性
當 Cloudflare 的 SSL 設定為 “Flexible” 時,它的行為是:
- 使用者與 Cloudflare 之間的請求:使用 HTTPS。
- Cloudflare 與你的伺服器之間的請求:強制使用 HTTP(無論後端伺服器是否支援 HTTPS)。
這裡的關鍵點是:
🔴 Cloudflare “Flexible SSL” 只允許 HTTP 連接後端伺服器,它不會因為 Apache 回傳 301 重定向,就自動改成用 HTTPS 發送請求!
這就導致一個矛盾的情況:
- Cloudflare 使用 HTTP 連接 Apache。
- Apache 看到 HTTP 請求,執行 301 重定向到 HTTPS。
- Cloudflare 收到這個 301 回應,但它仍然按照 “Flexible SSL” 規則,只使用 HTTP 發送請求。
- Cloudflare 再次請求 Apache,還是使用 HTTP,然後 Apache 又執行 301 重定向。
- 進入無限循環(Redirect Loop)。
(2) Cloudflare 認為它自己已經處理 HTTPS
Cloudflare 在 Flexible SSL 模式下,它「假裝」你的伺服器已經支援 HTTPS。
- 從使用者的角度來看,網站是 HTTPS 的(因為 Cloudflare 會自動替換網址顯示 HTTPS)。
- 但事實上,Cloudflare 和你的伺服器之間的連線仍然是 HTTP。
因此,即使 Apache 要求 Cloudflare 改用 HTTPS 請求(透過 301),Cloudflare 仍然會說:「不行,我的 Flexible SSL 規定就是只能用 HTTP 連後端伺服器。」
這導致 Cloudflare 會一直用 HTTP 發送請求,然後一直被 Apache 重定向,形成 無限重定向循環。
解決方案
要解決這個問題,有兩個主要方法:
把 Cloudflare SSL 模式改成 “Full” 或 “Full (Strict)”
這樣 Cloudflare 會改用 HTTPS 連接 Apache,就不會觸發 Apache 的 301 重定向規則,問題自然解決。
步驟:
- 登入 Cloudflare。
- 選擇你的網站,進入 SSL/TLS 設定。
- 選擇 “Full” 或 “Full (Strict)”:
- Full:Cloudflare 會用 HTTPS 連接 Apache,但不驗證 SSL 憑證的真偽。
- Full (Strict):Cloudflare 會用 HTTPS 連接 Apache,並且要求 SSL 憑證是有效的(建議使用 Let’s Encrypt)。
這樣,Cloudflare 會按照 301 重定向的要求,以 HTTPS 發送請求,問題就解決了。
修改 Apache 設定,避免重定向 Cloudflare 的請求
如果 無法修改 Cloudflare 設定(例如某些免費計劃可能無法使用 Full SSL),可以讓 Apache 判斷請求是否來自 Cloudflare,避免對 Cloudflare 進行 301 重定向。
解決方案:修改 Apache 設定
<VirtualHost *:80>
ServerName musicevent.realnewbie.com
# 只有當請求不是 HTTPS,而且不是來自 Cloudflare 時,才執行 HTTP → HTTPS 301 重定向
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>
解釋:
X-Forwarded-Proto
是 Cloudflare 傳給 Apache 的標頭,表示原始請求的協議(HTTP 或 HTTPS)。RewriteCond %{HTTP:X-Forwarded-Proto} !https
:- 如果 Cloudflare 送來的請求標示為 HTTPS,則 不執行 301 重定向。
- 如果請求是普通使用者直接連線(非 Cloudflare),則執行 301 重定向。
這樣,Cloudflare 仍然可以用 HTTP 發送請求,而使用者的瀏覽器會正確使用 HTTPS 來訪問網站。
總結
🔹 問題的根源
- Cloudflare Flexible SSL 只允許 HTTP 連接伺服器,即使 Apache 回應 301,它還是堅持用 HTTP。
- Apache 強制 HTTP → HTTPS 重定向,但 Cloudflare 無視這個要求,導致無限重定向循環。
🔹 解決方案
- 最佳解法:把 Cloudflare SSL 模式改成 “Full” 或 “Full (Strict)”,讓 Cloudflare 以 HTTPS 連接 Apache。
- 如果不能改 Cloudflare 設定:修改 Apache 設定,利用
X-Forwarded-Proto
避免 Cloudflare 觸發 301 重定向。
這樣,你的網站就能正常運作,不會發生 301 無限重定向問題了! 🚀