使用 CloudFlare SSL 憑證後出現過多重新導向的問題

CloudFlare 是一間非常有名的 CDN 廠商, 除了 CDN 與抗DDoS 的功能外, 免費版也提供了 SSL 憑證服務, 讓網站可以立刻從 HTTP 升級到 HTTPS, 使網站內容可以安全傳遞.

某日一個掛在 CloudFlare 的服務突然不能訪問, 只要嘗試訪問服務都會出現 ERR_TOO_MANY_REDIRECTS(過多重新導向) 的問題, 經過追查後整理出成因與解決辦法

發生條件


Cloudflare SSL 模式選擇 Flexible
Server Side 有設定 HTTP rewrite to HTTPS

發生原因

先來看 一下 CloudFlare SSL 的各種模式

(來源: https://www.cloudflare.com)

從上圖可以看出 Flexible 與 Full 最大的差別在於 CloudFlare 與 Origin Server 之間是否走 HTTPS, 這也是過多重新導向的核心原因

若我們在 Origin Server 設定 HTTP 自動導往 HTTPS, 或者程式本身有重新導向(Ex: WordPress), 從 Flexible 的角度來看, CloudFlare 透過 HTTP 存取 Origin, Origin 根據設定要求 Rewrite 到 HTTPS, CloudFlare 將 301/302 導向送往使用者端, 但SSL 模式下, 使用者訪問的網址已經是 HTTPS 了, 因此發生 HTTPS 不斷跳往 HTTPS 的問題, 這也就引發了 ERR_TOO_MANY_REDIRECTS 的問題

解決辦法

  1. Origin Server 關閉 HTTP 導向 HTTPS 功能
  2. 啟動 SSL Full 模式, 直接使用 HTTPS 訪問 Origin (推薦)
    (備註: Origin 要啟動 HTTPS, Strict 模式下憑證必須是有效的不能自簽)

後記

服務本身就有提供HTTPS, 但為了相容一些舊設備因此繼續開放HTTP, 前些日子為了提升整體安全性將所有流量導往 HTTPS, 沒想到悲劇就這樣發生了, 雖然快速找到問題並暫時後復, 但團隊為此猶豫要不要繼續開放 HTTP, 後來研究發現 CloudFlare SSL 相容性竟然意外的好, 因此後續還是強制使用 HTTPS.