管理緩存行為

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

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

但是,由於 Cloud Functions 和 Cloud Run 服務動態生成內容,因此給定 URL 的內容可能會因用戶輸入或用戶身份等因素而異。為了解決這個問題,由後端代碼來處理請求不會對CDN默認緩存。

你可以,不過,配置緩存行為動態內容。例如,如果一個函數只是周期性地生成新內容,您可以通過將生成的內容緩存至少一小段時間來加速您的應用程序。

您還可以潛在地降低函數執行成本,因為內容是從 CDN 而不是通過觸發函數提供的。了解更多關於優化功能的執行和服務的雲功能雲上運行的文件。

了解更多關於谷歌的緩存行為的Web開發者文檔

設置緩存控制

您使用管理動態內容緩存的主要工具是Cache-Control頭。通過配置此標頭,您可以向瀏覽器和 CDN 傳達您的內容可以緩存多長時間。在你的函數,你設置Cache-Control像這樣:

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

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

  • public -標記高速緩存為public 。這意味著,在瀏覽器中間服務器(意味著為CDN火力地堡主機)可以緩存該內容。

  • max-age -告訴瀏覽器和CDN多少秒,他們可以緩存內容。當設置的時間到期時,瀏覽器和 CDN 必須與源服務器重新驗證內容。在這個例子中頭,我們允許在瀏覽器和CDN緩存五分鐘的內容(見s-maxage以下為CDN緩存特定控件)。

  • s-maxage -覆蓋的max-age的指令只有CDN緩存;告訴 CDN 它可以緩存內容的秒數。當設置的時間到期時,CDN 必須與源服務器重新驗證內容。在這個例子中頭,我們覆蓋的設置max-age僅針對CDN並允許CDN緩存十分鐘的內容。

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

您可以了解更多關於Cache-Control在標題Mozilla開發者網絡和谷歌在網絡開發者文檔

什麼時候提供緩存內容?

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

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

改變標題

所述Vary確定哪個請求應該標頭被用於提供一個適當的響應(高速緩存的內容是否有效或如果內容應當與原始服務器重新驗證)。

火力地堡主機自動設置適當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頭分別進行緩存。需要注意的是託管增加Cookie ,並AuthorizationVary默認標題時,請求動態內容的製作。這可確保您使用的任何會話或 cookie 授權標頭都成為緩存密鑰的一部分,從而防止內容意外洩漏。

另請注意:

  • 只有GETHEAD請求可以被緩存。使用其他方法的 HTTPS 請求永遠不會被緩存。

  • 添加設置時的小心Vary頭。您添加的設置越多,CDN 提供緩存內容的可能性就越小。還記得Vary是基於請求頭,不響應頭。

使用 cookie

將 Firebase 託管與 Cloud Functions 或 Cloud Run 一起使用時,通常會從傳入請求中去除 cookie。這是必要的,以便有效地CDN緩存行為。 Only的特別命名__session cookie被允許通過,從而使您的應用程序的執行。

如果存在, __session cookie被自動進行緩存鍵的一部分,意味著它有兩個用戶提供不同的Cookie不可能接收緩存的響應對方的。僅使用__session如果您的應用程序提供根據用戶的權限不同內容的cookie。