Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

管理緩存行為

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

Firebase 託管使用強大的全球 CDN 來讓您的網站盡可能快地運行。

任何請求靜態內容都會自動緩存在 CDN 上。如果您重新部署網站的內容,Firebase 託管會自動清除 CDN 中所有緩存的靜態內容,直到下一次請求。

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

不過,您可以為動態內容配置緩存行為。例如,如果一個函數只定期生成新內容,您可以通過至少在短時間內緩存生成的內容來加速您的應用程序。

您還可以潛在地降低函數執行成本,因為內容是從 CDN 提供的,而不是通過觸發函數提供的。在Cloud FunctionsCloud Run文檔中閱讀有關優化函數執行和服務的更多信息。

在 Google 的Web 開發人員文檔中了解有關緩存行為的更多信息。

設置緩存控制

用於管理動態內容緩存的主要工具是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 必須與源服務器重新驗證內容。在示例標頭中,我們僅覆蓋 CDNmax-age設置,並允許 CDN 將內容緩存十分鐘。

對於max-ages-maxage ,將它們的值設置為您對用戶接收陳舊內容感到滿意的最長時間。如果頁面每隔幾秒更改一次,請使用較小的時間值。但是,其他類型的內容可以安全地緩存數小時、數天甚至數月。

您可以在Mozilla 開發人員網絡和 Google 的Web 開發人員文檔中了解有關Cache-Control標頭的更多信息。

何時提供緩存內容?

瀏覽器和 CDN 緩存您的內容基於:

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

改變標題

Vary標頭確定應使用哪些請求標頭來提供適當的響應(緩存的內容是否有效,或者是否應使用源服務器重新驗證內容)。

Firebase 託管會針對常見情況自動在您的響應中設置適當的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 託管與 Cloud Functions 或 Cloud Run 一起使用時,通常會從傳入請求中刪除 cookie。這對於允許高效的 CDN緩存行為是必要的。只有特別命名的__session cookie 被允許傳遞給您的應用程序的執行。

如果存在, __session cookie 會自動成為緩存鍵的一部分,這意味著具有不同 cookie 的兩個用戶不可能接收到對方的緩存響應。僅當您的應用根據用戶授權提供不同的內容時,才使用__session cookie。