Cloud CDN 是 App Hosting 支援網頁應用程式的重要環節。所有對後端的請求都會先經過 Cloud CDN。CDN 中已快取的內容會立即提供給使用者,不必前往執行網頁應用程式伺服器程式碼的 Cloud Run 服務。如要進一步瞭解 CDN 的一般優點,請前往 web.dev。
雖然基本 Cloud CDN 設定是由 App Hosting 設定,且無法修改,但您可以採取許多做法來最佳化快取,進而提高網頁載入速度、減少未快取的計費內容,以及盡量減少 Cloud Run 的流量。
可快取的內容
如果符合以下「所有」條件,Cloud CDN 就會將回應儲存在快取中:
- 要求為 GET 
- 回應的狀態碼為 - 200、- 203、- 204、- 206、- 300、- 301、- 302、- 307、- 308、- 404、- 405、- 410、- 421、- 451或- 501。
- 回應具有 - Cache-Control標頭,其中包含- max-age或- s-maxage指令,或是具有- Expires標頭,其中包含未來的時間戳記。
- 回應含有 - Age標頭或含有明確- public指令的- Cache-Control標頭。
- 回覆大小小於或等於 10 MiB。 
且不符合下列任何條件:
- 回應含有 - Set-Cookie標頭
- 回應的 - Vary標頭值不是- Accept、- Accept-Encoding、- Access-Control-Request-Headers、- Access-Control-Request-Method、- Origin、- Sec-Fetch-Dest、- Sec-Fetch-Mode、- Sec-Fetch-Site、- X-Goog-Allowed-Resources、- X-Origin、- RSC、- Next-Router-State-Tree、- Next-Router-Prefetch或- Next-Router-Segment-Prefetch。
- 回應具有 - Cache-Control標頭,其中包含- no-store或- private指令。
- 要求具有 - Cache-Control標頭和- no-store指令。
- 除非回應有明確的快取控制指令,否則要求會包含 - 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-age和s-maxage,Cloud CDN 會使用s‑maxage。系統不會提供含有這項指令的回應。s-max-age(兩個連字號) 不適用於快取。 | 
| max-stale=SECONDS | max-stale要求指令會規定用戶端願意接受的陳舊程度上限 (以秒為單位)。Cloud CDN 會遵守這項規定,且只有在回應的過時程度低於max-stale指令時,才會傳回過時的快取回應。否則,系統會在處理要求前重新驗證。 | 不適用 | 
| stale-while-revalidate=SECONDS | 不適用 | 在非同步重新驗證期間,系統會向用戶端提供含有 stale-while-revalidate的回應,最多可達 SECONDS。 | 
| must-revalidate | 不適用 | 如果回應包含 must-revalidate,則會在過期後重新向原始伺服器驗證。系統不會提供含有這項指令的回應。 | 
| proxy-revalidate | 如果回應包含 proxy-revalidate,則會在過期後重新向原始伺服器驗證。系統不會提供含有這項指令的回應。 | |
| no-transform | 不適用 | Cloud CDN 不會套用任何轉換。 | 
評估已快取和未快取的流量
App Hosting 控制台「用量」分頁中的「Cloud CDN - Outgoing Bandwidth」(Cloud CDN - 輸出頻寬) 圖表會顯示已快取和未快取的服務位元組,並標示每次推出版本的時間。您可以根據這張圖表,評估快取最佳化措施的成效。
您也可以使用以路徑為準的監控功能,查看網頁應用程式中特定路徑的快取命中率。