快取應用程式內容

Cloud CDN 是 App Hosting 支援網頁應用程式的重要環節。所有對後端的要求都會先經過 Cloud CDN。CDN 中已快取的內容會立即提供給使用者,不必前往執行網頁應用程式伺服器程式碼的 Cloud Run 服務。如要進一步瞭解 CDN 的一般優點,請前往 web.dev

雖然基本 Cloud CDN 設定是由 App Hosting 設定,且無法修改,但您可以採取許多做法來最佳化快取,以提高網頁載入速度、減少未快取的計費內容,並盡量減少 Cloud Run 的流量。

可快取的內容

如果符合下列「所有」條件,Cloud CDN 就會將回應儲存在快取中:

  1. 要求為 GET

  2. 回應的狀態碼為 200203204206300301302307308404405410421451501

  3. 回應具有包含 max-ages-maxage 指令的 Cache-Control 標頭,或具有包含未來時間戳記的 Expires 標頭。

  4. 回應具有 Age 標頭或包含明確 public 指令的 Cache-Control 標頭。

  5. 回應大小小於或等於 10 MiB。

不符合下列任何條件:

  1. 回應含有 Set-Cookie 標頭

  2. 回應的 Vary 標頭值不是 AcceptAccept-EncodingAccess-Control-Request-HeadersAccess-Control-Request-MethodOriginSec-Fetch-DestSec-Fetch-ModeSec-Fetch-SiteX-Goog-Allowed-ResourcesX-OriginRSCNext-Router-State-TreeNext-Router-PrefetchNext-Router-Segment-Prefetch

  3. 回應具有包含 no-storeprivate 指令的 Cache-Control 標頭。

  4. 要求具有包含 no-store 指令的 Cache-Control 標頭。

  5. 要求具有 Authorization 標頭,除非回應具有明確的快取控制指令。

使用快取控制指令自訂行為

Next.js

Next.js 會根據多項因素,隱含設定快取控制指令。不過,您可以在 next.config.js 檔案中手動設定標頭,覆寫這些值。舉例來說,如要確保網頁不會在 Cloud CDN 中快取,請執行下列操作:

  /** @type {import('next').NextConfig} */
  const nextConfig = {
      headers: async () => [{
          source: "/YOUR_PRIVATE_PAGE",
          headers: [{
              key: "Cache-Control",
              value: "private"
          }],
      }],
  };

Angular

Angular SSR 不會直接設定明確的快取控制指令。您可以在伺服器路徑中指定快取控制標頭,自行新增快取控制標頭。舉例來說,如要允許 Cloud CDN 將所有網頁快取一小時,請執行下列操作:

import { RenderMode, ServerRoute } from '@angular/ssr';

export const serverRoutes: ServerRoute[] = [
  {
    path: '**',
    renderMode: RenderMode.Prerender,
    headers: {
      'Cache-Control': 'public, max-age=3600',
    }
  }
];

如要確保特定網頁「不會」快取:

import { RenderMode, ServerRoute } from '@angular/ssr';

export const serverRoutes: ServerRoute[] = [
  // ... other routes
  {
    path: 'YOUR_PRIVATE_PAGE',
    renderMode: RenderMode.Server,
    headers: {
      'Cache-Control': 'private',
    }
  }
];

遵守指令

Firebase App Hosting 的 Cloud CDN 執行個體會遵守下列快取控制指令:

指令 要求 回應
no-store 如果要求中包含這項標頭,系統就不會快取回應。 系統不會快取含有 no-store 的回應。
no-cache 系統會忽略 no-cache 要求指令,避免用戶端可能啟動或強制重新驗證來源。 系統會快取含有 no-cache 的回應,但必須先向來源重新驗證,才能提供回應。
public 不適用 這項指令並非可否快取的必要條件,但如果內容應由 Proxy 快取,最佳做法是加入這項指令。
private 不適用 即使回應在其他情況下可快取,Cloud CDN 也不會快取含有 private 指令的回應。用戶端 (例如瀏覽器) 可能仍會快取結果。使用 no-store 可避免快取所有回應。
max-age=SECONDS 系統會忽略 max-age 要求指令,並傳回已快取的回應,如同要求中不具有此標頭一樣。 含有 max-age 指令的回應會快取至已定義的秒數。
s-maxage=SECONDS 不適用 含有 s-maxage 指令的回應會快取至已定義的秒數。如果 max-ages-maxage 同時存在,Cloud CDN 會使用 s‑maxage。若回應含有這項指令,系統不會提供過時內容。s-max-age (兩個連字號) 不適用於快取。
max-stale=SECONDS max-stale 要求指令會規定用戶端願意接受的「過時程度」上限 (以秒為單位)。Cloud CDN 會遵守這項指令,且只在回應的過時程度小於 max-stale 指令時,才會傳回過時的已快取回應。否則,Cloud CDN 會先重新驗證,再提供要求。 不適用
stale-while-revalidate=SECONDS 不適用 執行非同步重新驗證時,最多可在 SECONDS 內向用戶端提供含有 stale-while-revalidate 的回應。
must-revalidate 不適用 回應到期後,系統會使用來源伺服器重新驗證含有 must-revalidate 的回應。若回應含有這項指令,系統不會提供過時內容。
proxy-revalidate 回應到期後,系統會使用來源伺服器重新驗證含有 proxy-revalidate 的回應。若回應含有這項指令,系統不會提供過時內容。
no-transform 不適用 Cloud CDN 不會套用任何轉換。

評估已快取和未快取的流量

App Hosting 控制台「用量」分頁中的「Cloud CDN - Outgoing Bandwidth」(Cloud CDN - 輸出頻寬) 圖表會顯示已快取和未快取的服務位元組,並標示每次推出版本的時間。您可以根據這張圖表,評估快取最佳化措施的成效。

您也可以使用以路徑為準的監控功能,查看網頁應用程式中特定路徑的快取命中率。