管理緩存行為

Firebase Hosting 使用強大的全球 CDN 讓您的網站盡可能快。

任何請求的靜態內容都會自動快取在 CDN 上。如果您重新部署網站的內容,Firebase 託管會自動清除 CDN 上的所有快取內容,直到下一個要求為止。

但是,由於 Cloud Functions 和 Cloud Run 服務動態產生內容,因此給定 URL 的內容可能會根據使用者輸入或使用者身分等因素而有所不同。考慮到這一點,預設情況下,後端程式碼處理的請求不會緩存在 CDN 上。

不過,您可以配置動態內容的快取行為。例如,如果某個函數僅定期產生新內容,您可以透過將產生的內容快取至少一小段時間來加快應用程式的速度。

您可以類似地配置快取行為,以潛在地降低函數執行成本,因為內容是從 CDN 而不是從觸發函數提供的。在Cloud FunctionsCloud Run文件中了解有關優化函數執行和服務的更多資訊。

傳回 404 錯誤的請求除外。 CDN 會將您的服務對不存在的 URL 的 404 回應快取 10 分鐘,以便從 CDN 之外提供對該 URL 的後續請求。如果您變更服務以使內容現在存在於該 URL 上,則 CDN 會繼續為任何快取的 404 提供服務 10 分鐘(最多),然後正常提供來自該 URL 的內容。

如果 404 回應已包含由 Cloud Functions 或 Cloud Run 服務設定的快取標頭,它們將覆蓋預設值 10 分鐘並完全確定 CDN 的快取行為。

在 Google 的網頁開發人員文件中了解有關快取行為的更多資訊。

設定緩存控制

用於管理動態內容快取的主要工具是Cache-Control標頭。透過配置此標頭,您可以與瀏覽器和 CDN 溝通您的內容可以快取多長時間。在您的函數中,您可以像這樣設定Cache-Control

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

在此範例標頭中,指令執行三件事:

  • public — 將快取標記為public 。這意味著瀏覽器中間伺服器(即 Firebase 託管的 CDN)都可以快取內容。

  • max-age — 告訴瀏覽器和 CDN 他們可以快取內容多少秒。當設定的時間到期時,瀏覽器和 CDN 必須與來源伺服器重新驗證內容。在範例標頭中,我們允許瀏覽器和 CDN 將內容快取五分鐘(有關 CDN 快取的特定控制,請參閱下面的s-maxage )。

  • s-maxage — 僅覆蓋 CDN 快取的max-age指令;告訴 CDN 它可以快取內容多少秒。當設定的時間到期時,CDN 必須與來源伺服器重新驗證內容。在範例標頭中,我們僅覆蓋 CDN 的max-age設置,並允許 CDN 將內容緩存十分鐘。

對於max-ages-maxage ,將其值設為您願意讓用戶接收過時內容的最長時間。如果頁面每隔幾秒鐘更改一次,請使用較小的時間值。然而,其他類型的內容可以安全地快取數小時、數天甚至數月。

您可以在Mozilla 開發人員網路和 Google 的Web 開發人員文件中了解更多關於Cache-Control標頭的資訊。

何時提供快取內容?

瀏覽器和 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 Hosting 與 Cloud Functions 或 Cloud Run 一起使用時,通常會從傳入請求中刪除 cookie。這是實現高效 CDN快取行為所必需的。僅允許特別命名的__session cookie 傳遞到您的應用程式的執行。

如果存在, __session cookie 會自動成為快取鍵的一部分,這表示兩個具有不同 cookie 的使用者不可能接收對方的快取回應。只有當您的應用程式根據使用者授權提供不同的內容時,才使用__session cookie。