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
標頭或Cache-Control
標頭,且含有明確的public
指令。回應大小小於或等於 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 指令的回應會快取至定義的 SECONDS。 |
s-maxage=SECONDS |
不適用 | 含有 s-maxage 指令的回應會快取至所定義的 SECONDS。如果同時存在 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 - 傳出頻寬」圖表會顯示已快取和未快取的位元組,並標示每個推出作業。您可以使用這張圖表來評估快取最佳化作業的成效。