如何讓 Cloudflare SSL Proxy 跟 Vercel 或 Netlify 一起使用

簡介

在這篇文章中,我們將學習如何設置 Cloudflare 代理,如果您的網站或應用程式托管在 Vercel 或 Netlify 或任何其他類似的服務上。

如果您托管網站的位置是像 Digital Ocean droplet 或任何其他 VPS,大多數步驟基本上都是一樣的,但在這裡,我想更專注於當您的網站托管在像 Vercel 或 Netlify 或其他基於 SaaS 的雲提供商的情況。

如果您直接尋找設置,請跳過下一節

但為什麼?

在我們開始進行這個過程之前,首先需要理解我們為什麼要這麼做,或者說為什麼這些雲提供商不會鼓勵您添加 Cloudflare 代理。

請記住,我並不是以任何貶低的方式來說這個,事實上,我已經使用 Netlify 和 Vercel 很長時間,並且喜歡他們的服務以及部署應用程式的簡便性。

但這是我在許多社區論壇上讀到的,他們並不鼓勵添加代理,並且他們有非常有力的理由。這些單獨的服務已經有他們自己的邊緣基礎設施,用於全球範圍內緩存靜態資源並對您的無伺服器功能進行負載均衡,如果有代理坐在中間可能進行相同的緩存層任務,那麼他們就無法控制客戶端到伺服器的請求生命週期。

如果您的目標是僅使用 Cloudflare 代理進行靜態資源的緩存,以便這些資源可以快速到達終端用戶,那麼我認為您不需要添加代理,這種用例已經由這些雲提供商很好地處理了。

如果您想對流量有更多的控制,那麼您肯定需要添加 Cloudflare 代理。

Cloudflare 代理將幫助您審查流量並應用一些配置,這些配置可以幫助您保護您的網站免受惡意用戶和攻擊者的侵害。

要使代理與 Vercel 或 Netlify 愉快地工作,需要做一些棘手的事情。所以讓我們深入瞭解一下。

預備知識

為了確保我們可以開始代理,有幾件事是必需的。

  1. 您已將網站添加到 Cloudflare,因此可以為您的網站更新 DNS 記錄。
  2. 您的網站托管在 Vercel 或 Netlify 上,並在 Cloudflare 上配置了頂級域(根級域)。

您根域的 Cloudflare DNS 設置

對您來說,代理狀態可能是 DNS Only 而不是代理。

啟用代理的步驟

您可能已經猜到,我需要將這個開關從 DNS Only 切換到 Proxy。

是的,但我們將在最後一步做這件事,在此之前,讓我們做一些必要的配置,以使代理能夠愉快地工作。

將您的 SSL/TLS 加密模式設置為完全

您可以在 SSL/TLSOverview 下找到此設置

Cloudflare SSL 加密模式設置為完全

這將加密您的 Cloudflare 代理與您的原始伺服器(可能是 Vercel 或 Netlify 或其他)之間的連接。

禁用永遠使用 HTTPS

不用擔心,你讀得沒錯,我知道我們建議將流量從 HTTP 重定向到 HTTPS,我們將在下一步使用頁面規則來做這個,但我們希望在這裡禁用它的原因是有些路由我們想從 HTTP 重定向到 HTTPS。

我們不想從 HTTP 重定向到 HTTPS 的路由是任何在 yourdomain.tld/.well-known/ 目錄下的內容。

這是因為 Vercel 或 Netlify 使用 Let’s Encrypt 來生成有效期為3個月並自動續訂的證書。

續訂流程是這樣的,Vercel 將訪問這個路由 yourdomain.tld/.well-known/acme-challenge。如果這個 HTTP 請求被重定向到 HTTPS,Let’s Encrypt 將無法代表 Vercel 為你的域名發放 SSL 證書。所以基本上,每當你的域名 SSL 證書的續訂流程到期時,它就會失敗,這意味著 Cloudflare 和 Vercel 之間的連接也會失敗。

為了避免這個情況,我們將添加一些頁面規則,以確保我們的網站總是使用 HTTPS,但如果有請求來續訂證書,則不會重定向到 HTTPS。

所以要禁用這個,請前往 SSL/TLSEdge Certificates,並禁用這個選項。

在 Cloudflare SSL Edge certificates 上禁用永遠使用 HTTPS

設置頁面規則

前往 RulesPage Rules

我們將在這裡添加兩個規則,一個是當任何請求在 .well-known 路徑下時禁用 SSL,另一個則是對所有其他路由始終使用 HTTPS。

那麼讓我們從第一個開始,創建一個新規則並添加如下圖所示的配置

為所有子域名和頂級域名匹配的 .well-known 路徑禁用 SSL 頁面規則

為所有子域名和頂級域名匹配的 .well-known 路徑禁用 SSL 頁面規則

保存此規則並添加另一個規則,以便對所有其他路由始終使用 HTTPS。

將所有子域名和頂級域名的所有作為 HTTP 請求進來的路徑升級到 HTTPS

將所有子域名和頂級域名的所有作為 HTTP 請求進來的路徑升級到 HTTPS

這裡最重要的細節是這些頁面規則的排序,我們要確保永遠使用 HTTPS 的規則在最後的順序,這樣我們對 .well-known 的頁面規則就會首先處理,並且不會升級到 HTTPS

所以確保你的順序看起來像這樣。

頁面規則的正確順序

頁面規則的正確順序

如果它們不是按這個順序排列的,那麼使用箭頭按鈕將它們排列成這個順序。

完成這些操作後,我們現在可以在 DNS 設置中從 DNS Only 啟用到 Proxied,如上所述。

測試

完成所有上述變更後,是時候進行測試了。

我們將進行兩項特定的測試,以驗證我們是否正確進行了配置。

  1. 所有發往 http://yourdomain.tld/.well-known/acme-challenge 的請求都不應被重定向到 HTTPS
  2. 所有發往 http://yourdomain.tld/ 的請求都應該被重定向到 https://yourdomain.tld

那麼讓我們來測試這兩種情況,打開你的終端並輸入 CURL 命令,將 yourdomain.tld 替換成你的實際域名。

shellCopy code

curl -IL http://yourdomain.tld/.well-known/acme-challenge

如果一切順利,你應該會看到類似的輸出,其中 HTTP 請求並未重定向到 HTTPS,並返回了 404 狀態碼,因為我的服務器上不存在這樣的文件。

HTTP 沒有被重定向到 HTTPS

HTTP 沒有被重定向到 HTTPS

shellCopy code

curl -IL http://yourdomain.tld

對於這個,我們將看到成功地將 HTTP 重定向到 HTTPS,並返回了 301 狀態碼。

所有其他請求都成功從 HTTP 重定向到 HTTPS

所有其他請求都成功從 HTTP 重定向到 HTTPS。現在,你已經成功配置了你的 Cloudflare 代理。

我希望你覺得這篇文章有幫助;下次見