管理快取行為

Firebase Hosting 會使用強大的全球 CDN,盡可能加快網站速度。

系統會自動在 CDN 上快取所有要求的靜態內容。如果您重新部署網站內容,Firebase Hosting 會自動清除 CDN 中的所有快取內容,直到下次要求為止。

不過,由於 Cloud FunctionsCloud Run 服務會動態產生內容,因此特定網址的內容可能會因使用者輸入內容或使用者身分而有所不同。為因應這種情況,根據預設,由後端程式碼處理的要求「不會」在 CDN 上快取。

不過,您可以設定動態內容的快取行為。舉例來說,如果函式只會定期產生新內容,您可以將產生的內容快取至少一段時間,藉此加快應用程式的速度。

您也可以以類似的方式設定快取行為,藉此降低函式執行成本,因為內容是從 CDN 而非觸發的函式提供。如要進一步瞭解如何最佳化函式執行作業和服務,請參閱 Cloud FunctionsCloud Run 說明文件。

例外狀況是要求傳回 404 錯誤。CDN 會將服務對不存在的網址的 404 回應快取 10 分鐘,以便後續對該網址的要求從 CDN 提供。如果您變更服務,讓內容現在位於這個網址,CDN 會繼續提供任何已快取的 404 錯誤網頁 (最多 10 分鐘),然後正常提供該網址的內容。

如果 404 回應已包含由 Cloud FunctionsCloud Run 服務設定的快取標頭,則會覆寫預設的 10 分鐘,並完全決定 CDN 的快取行為。

如要進一步瞭解快取行為,請參閱 Google 的網頁開發人員說明文件

設定 Cache-Control

Cache-Control 標頭是用來管理動態內容快取的主要工具。設定這個標頭後,您就能向瀏覽器和 CDN 傳達內容的快取時間長度。在函式中,您可以將 Cache-Control 設為以下方式:

res.set('Cache-Control', 'public, max-age=300, s-maxage=600');

在這個範例標頭中,指令會執行三項操作:

  • public:將快取標示為 public。這表示瀏覽器中介伺服器 (即 Firebase Hosting 的 CDN) 都能快取內容。

  • max-age:告知瀏覽器和 CDN 可以快取內容的秒數。設定時間到期後,瀏覽器和 CDN 必須透過原始伺服器重新驗證內容。在範例標頭中,我們允許瀏覽器和 CDN 將內容快取五分鐘 (如要瞭解 CDN 快取的具體控制項,請參閱下方的 s-maxage)。

  • s-maxage:僅針對 CDN 快取覆寫 max-age 指示;告知 CDN 可快取內容的秒數。設定時間到期後,CDN 必須透過原始伺服器重新驗證內容。在範例標頭中,我們會覆寫 max-age 的設定 (僅限 CDN),並允許 CDN 快取內容十分鐘。

針對 max-ages-maxage,將其值設為使用者接收過時內容可接受的最長時間。如果網頁每隔幾秒就變更,請使用較小的時間值。不過,其他類型的內容可以安全地快取數小時、數天,甚至數月。

如要進一步瞭解 Cache-Control 標頭,請參閱 Mozilla Developer Network 和 Google 的網頁開發人員說明文件

何時會提供快取內容?

瀏覽器和 CDN 會根據下列條件快取您的內容:

  • 主機名稱
  • 路徑
  • 查詢字串
  • Vary 標頭中指定的請求標頭內容

變動標頭

Vary 標頭會決定應使用哪些要求標頭來提供適當的回應 (快取內容是否有效,或內容是否應透過原始伺服器重新驗證)。

Firebase Hosting 會在回應中自動設定適當的 Vary 標頭,以便處理常見情況。在大多數情況下,您不需要擔心 Vary 標頭。不過,在某些進階用途中,您可能需要其他標頭來影響快取。在這種情況下,您可以在回應中設定 Vary 標頭。例如:

res.set('Vary', 'Accept-Encoding, X-My-Custom-Header');

在這種情況下,Vary 標頭的值為:

vary: X-My-Custom-Header, x-fh-requested-host, accept-encoding, cookie, authorization

在這些設定下,如果兩個要求的 X-My-Custom-Header 標頭不同,但其他方面相同,系統會分別將這兩個要求快取。請注意,當您針對動態內容提出要求時,Hosting 預設會將 CookieAuthorization 新增至 Vary 標頭。這樣一來,您使用的任何工作階段或 Cookie 授權標頭都會成為快取金鑰的一部分,可避免內容意外外洩。

另請注意:

  • 只有 GETHEAD 要求可以快取。使用其他方法的 HTTPS 要求永遠不會快取。

  • Vary 標頭中新增設定時,請務必小心。您新增的設定越多,CDN 提供快取內容的可能性就越低。請注意,Vary 是根據要求標頭,而非回應標頭。

使用 Cookie

當您將 Firebase HostingCloud FunctionsCloud Run 搭配使用時,系統通常會從傳入要求中移除 Cookie。這項設定是為了讓 CDN 快取行為更有效率。只有具備特殊名稱的 __session Cookie 才能傳送至應用程式執行作業。

出現時,__session Cookie 會自動成為快取鍵的一部分,也就是說,如果有兩位使用者使用不同的 Cookie,他們無法收到對方的快取回應。只有在應用程式會根據使用者授權放送不同內容時,才使用 __session Cookie。