設定快取行為

Media CDN 會使用 Google 的全球邊緣快取基礎架構,快取內容並降低來源基礎架構的負載,盡可能提供離使用者較近的內容。

您可以控管每個路由的內容快取方式。這可讓您根據內容類型、用戶端要求屬性和新鮮度需求,調整行為。

可快取性

下列各節將說明 Media CDN 快取的回應內容,以及如何改善快取卸載作業。

預設快取行為

根據預設,下列快取相關設定會套用至每項 Edge Cache 服務:

  • CACHE_ALL_STATIC 的預設快取模式:

    • 遵循來源快取指令 (例如 Cache-ControlExpires),最多可設定為存留時間上限。
    • 如果沒有來源快取指示,系統會自動快取靜態媒體類型,並設定 3600 秒的預設 TTL。
    • 快取 HTTP 200、204 和 206 狀態碼 (未啟用負面快取)。
  • 不會快取具有 no-storeprivate 快取控制指令的回應,或無法快取的回應。

除非明確設定快取功能,否則系統不會快取非靜態內容或缺少有效快取指令的回應。如要瞭解如何覆寫預設行為,請參閱快取模式說明文件

預設行為等同於下列 cdnPolicy。未明確設定 cdnPolicy 的路徑會以以下設定運作:

cdnPolicy:
  cacheMode: CACHE_ALL_STATIC
  defaultTtl: 3600s
  cacheKeyPolicy:
    includeProtocol: false
    excludeHost: false
    excludeQueryString: false
  signedRequestMode: DISABLED
  negativeCaching: false

可快取的回應

快取回應是指 Media CDN 可儲存及快速擷取的 HTTP 回應,可加快載入時間。並非所有 HTTP 回應都可以快取。

您可以為每個路徑設定快取模式,藉此覆寫這項行為 (例如,使用 CACHE_ALL_STATIC 快取模式快取常見的媒體類型),即使來源未在回應中設定快取控制指示語,也能這麼做。

符合「無法快取的回應」中定義條件的要求和回應,會取代快取功能。

下表說明快取特定 HTTP 回應的相關規定。GETHEAD 回應都必須遵守這些規定。

HTTP 屬性 需求條件
狀態代碼 回應狀態碼必須為 200、203、204、206、300、301、302、307、308、400、403、404、405、410、451、500、501、502、503 或 504。
HTTP 方法 GETHEAD
要求標頭 系統會忽略大多數快取要求指令。詳情請參閱「快取控制指令」。
回應標頭

包含有效的 HTTP 快取指令,例如 Cache-Control: max-age=3600, public

具有快取模式,可快取該內容,或具有 Expires 標頭,其中包含未來的日期。

回應大小 最多 100 GiB。

HTTP Age 標頭會根據 Media CDN 首次快取回應的時間設定,通常代表物件在來源遮蔽位置快取後經過的秒數。如果來源產生 Age 回應標頭,請使用 FORCE_CACHE_ALL 快取模式,以免在 Age 超過快取 TTL 時,導致重新驗證。

如要進一步瞭解 Media CDN 如何解讀 HTTP 快取指令,請參閱「快取控制指令」。

來源需求

如要讓 Media CDN 快取超過 1 MiB 的原始回應,來源必須在 HEADGET 要求的回應標頭中加入下列資訊,除非另有指定:

  • Last-Modified ETag HTTP 回應標頭 (驗證器)。
  • 有效的 HTTP Date 標頭。
  • 有效的 Content-Length 標頭。
  • 回應 Range GET 要求的 Content-Range 回應標頭。Content-Range 標頭必須包含有效值,格式為 bytes x-y/z (其中 z 是物件大小)。

預設來源通訊協定為 HTTP/2。如果來源僅支援 HTTP/1.1,您可以明確設定每個來源的通訊協定欄位。

無法快取的回應

下表詳細說明可防止系統快取回應的要求和回應屬性。雖然可快取,但符合「不可快取」條件的回應不會快取。

HTTP 屬性 需求
狀態代碼

除了已定義為可快取的狀態碼之外,例如 HTTP 401、HTTP 412 或 HTTP 505。

這些狀態碼通常代表客戶端問題,而非來源狀態。快取這些回應可能會導致「快取中毒」情況,也就是說,系統會為所有使用者快取使用者觸發的「錯誤」回應。

要求標頭

如果要求含有 Authorization 要求標頭,回應必須包含 public Cache-Control 指令才能快取。

要求中的 no-store 指令會導致系統不會快取回應。詳情請參閱「快取控制指令」。

回應標頭

含有 Set-Cookie 標頭。

使用 AcceptAccept-EncodingOriginX-OriginX-Goog-Allowed-ResourcesSec-Fetch-DestSec-Fetch-ModeSec-Fetch-Site 以外的 Vary 標頭。

CACHE_ALL_STATICUSE_ORIGIN_HEADERS 模式中,具有 no-storeprivate 快取控制指令。

回應大小 大於 100 GiB。

除了設定的快取模式外,這些規則也會套用。具體情況如下:

  • 設定 CACHE_ALL_STATIC 快取模式後,系統只會快取視為靜態內容的回應,或是回應標頭中含有有效快取指令的回應。其他回應則會以原樣轉送。
  • FORCE_CACHE_ALL 快取模式會無條件快取所有回應,但須遵守先前所述的不可快取性規定。
  • USE_ORIGIN_HEADERS 快取模式除了需要快取狀態碼外,還要求回應在回應標頭中設定有效的快取指令。

注意:

  • 未快取的回應不會變更快取控制指令或其他標頭,而是會原封不動地進行 Proxy。
  • 回應的 Cache-ControlExpires 標頭可摺疊為單一 Cache-Control 欄位。舉例來說,如果回覆內容包含 Cache-Control: publicCache-Control: max-age=100 兩個不同行,系統會將其摺疊為 Cache-Control: public,max-age=100
  • 從計費角度來看,無法快取的回應 (永遠不會快取的回應) 不會計為 Cache Egress

使用快取模式

快取模式可讓您設定 Media CDN 應在何時遵循來源快取指令、快取靜態媒體類型,以及快取來源的所有回應,不受指令集影響。

快取模式是在路由層級設定,並結合 TTL 覆寫值,讓您可以依主機、路徑、查詢參數和標頭 (任何可比對的要求參數) 設定快取行為。

  • 根據預設,Media CDN 會使用 CACHE_ALL_STATIC 快取模式,自動快取常見的靜態媒體類型 1 小時 (3600 秒),同時為可快取的回應指定來源,以便優先快取。
  • 您可以設定路線上的 cdnPolicy.defaultTtl 欄位,藉此增加或減少套用至回應的快取存留時間,而無需設定明確的快取存留時間 (max-ages-maxage 指令)。
  • 為避免快取非成功回應的時間超過預期,系統不會根據 Content-Type (MIME 類型) 快取非 2xx (非成功) 狀態碼,也不會套用預設的 TTL。

下表列出可用的快取模式,這些模式會在每個路徑的 cdnPolicy.cacheMode 上設定。

快取模式 行為
USE_ORIGIN_HEADERS 要求來源回應設定有效的快取指令和有效的快取標頭。如需完整的規定清單,請參閱「可快取的回應」。
CACHE_ALL_STATIC

自動快取含有靜態內容的成功回應,除非這些回應含有 no-storeprivate 指示。系統會優先採用來源提供的有效快取指令。

靜態內容包括影片、音訊、圖片和常見的網頁素材資源,這些內容的 MIME 類型皆由 Content-Type 回應標頭所定義。

FORCE_CACHE_ALL

無條件快取成功的回應,覆寫來源設定的任何快取指令。

請務必在設定此模式時,不要提供私人、個別使用者內容 (例如動態 HTML 或 API 回應)。

BYPASS_CACHE

任何與已設定此快取模式的路徑相符的要求都會略過快取,即使有快取物件與該快取索引鍵相符也不例外。

我們建議您只在偵錯時使用這項功能,因為 Media CDN 是設計用於全球規模的快取基礎架構,而非通用 Proxy。

靜態內容 MIME 類型

CACHE_ALL_STATIC 快取模式可讓 Media CDN 根據 Content-Type HTTP 回應標頭中傳回的 MIME 類型,自動快取影片、音訊、圖片和常見網頁素材資源等常見靜態內容。不過,無論媒體類型為何,Media CDN 都會優先處理來源回應中的任何明確 Cache-ControlExpires 標頭。

下表列出可透過 CACHE_ALL_STATIC 快取模式自動快取的 MIME 類型。

如果回應沒有 Content-Type 回應標頭,且標頭值與下列值不符,系統就不會自動快取回應。您必須確保回應會設定有效的快取指示語,或是必須使用 FORCE_CACHE_ALL 快取模式,才能無條件快取回應。

類別 MIME 類型
網頁素材資源 text/css text/ecmascript text/javascript application/javascript
字型 任何與 font/* 相符的 Content-Type
圖片 任何與 image/* 相符的 Content-Type
影片 任何與 video/* 相符的 Content-Type
音訊 任何與 audio/* 相符的 Content-Type
格式化文件類型 application/pdf and application/postscript

注意事項:

  • 原始網站的網路伺服器軟體必須為每個回應設定 Content-Type。許多網路伺服器會自動設定 Content-Type 標頭,包括 NGINX、Varnish 和 Apache。
  • 當您使用 Google Cloud 控制台或 gcloud CLI 上傳內容時,Cloud Storage 會自動在上傳時設定 Content-Type 標頭
  • Cloud Storage 一律會向 Media CDN 提供 Cache-Control 標頭。如未明確選擇值,則會傳送預設值。因此,除非您明確調整 Cloud Storage 中物件的快取控制中繼資料,或使用 FORCE_CACHE_ALL 模式覆寫 Cloud Storage 傳送的值,否則所有成功的 Cloud Storage 回應都會根據 Cloud Storage 預設值快取。

如果回應可根據其 MIME 類型進行快取,但具有 privateno-storeCache-Control 回應指示,或是 Set-Cookie 標頭,則不會快取。

系統預設不會快取其他媒體類型,例如 HTML (text/html) 和 JSON (application/json)。這類回應通常是動態的 (依使用者而異),也不太適合 Media CDN 的架構。建議您使用 Cloud CDN 來提供網路資產,以及快取 API 回應。

設定快取存留時間

存留時間 (TTL) 覆寫值可讓您為快取內容設定預設 TTL 值,並覆寫來源在 max-ages-maxage 快取控制指示 (或 Expires 標頭) 中設定的 TTL 值。

無論是透過覆寫或使用快取指令設定,存留時間都是樂觀的。不常存取或不受歡迎的內容,可能會在達到 TTL 前從快取中移除。

下表列出三種 TTL 設定。

設定 預設 下限 上限 說明 適用的快取模式
Default TTL 1 小時
(3600 秒)
0 秒 1 年
(31,536,000 秒)

當來源未指定 max-ages-maxage 標頭時,要設定的 TTL。

如果來源指定 s-maxage 標頭,系統會使用該標頭,而非預設的 TTL 值。

使用 FORCE_CACHE_ALL 無條件快取所有回應時,系統會使用預設的 TTL 來設定快取 TTL。系統會忽略所有其他值和指令。

CACHE_ALL_STATIC

FORCE_CACHE_ALL

Max TTL 1 天
(86400 秒)
0 秒 1 年
(31,536,000 秒)
針對可快取的回應,允許的存留時間上限。大於此值的值會設為 maxTtl 的值。 CACHE_ALL_STATIC
Client TTL 預設為未設定。 0 秒 1 天
(86400 秒)
針對可快取的回應,如果需要與其他 TTL 值不同,則在下游 (面向用戶端) 回應中允許的最大 TTL。

CACHE_ALL_STATIC

FORCE_CACHE_ALL

將任何 TTL 值設為零 (0 秒) 會導致每項要求在傳送回應前,都會向原始來源重新驗證,如果設定過於廣泛,也會增加對原始來源的負載。

將快取模式設為 Use Origin Headers 時,Media CDN 會依賴來源驅動行為,因此無法設定 TTL 設定。

注意:

  • 存留時間上限的值一律必須大於 (或等於) 預設存留時間的值。
  • 用戶端 TTL 的值一律必須小於 (或等於) 最大 TTL 的值。
  • 當 Media CDN 覆寫來源 TTL 值時,傳送至用戶端的 Cache-Control 標頭也會反映該值。
  • 如果原始來源設定 Expires 標頭,而 Media CDN 覆寫有效的 TTL (根據時間戳記),則會在傳送至用戶端的下游回應中,將 Expires 標頭替換為 Cache-Control 標頭。

負面快取

負向快取會定義 Media CDN 如何快取非成功的 HTTP 狀態碼 (2xx 以外的狀態碼)。

這樣一來,您就能快取錯誤回應,例如重新導向 (HTTP 301 和 308) 和找不到 (HTTP 404) 回應,讓使用者更容易取得這些回應。如果回應不太可能變更且可快取,您還能進一步減少來源負載。

根據預設,系統會停用負向快取功能。下表列出啟用負向快取功能且未使用 negativeCachingPolicy 時,每個狀態碼的預設值。

狀態碼 Reason-phrase 存留時間
HTTP 300 多個選擇 10 分鐘
HTTP 301HTTP 308 永久重新導向 10 分鐘
HTTP 404 找不到 120 秒
HTTP 405 找不到方法 60 秒
HTTP 410 Gone (消失) 120 秒
HTTP 451 因法律原因而無法使用 120 秒
HTTP 501 未執行 60 秒

預設的負面快取代碼組合會與 HTTP RFC 9110 中所述的啟發式快取狀態碼相符,但有以下例外狀況:

  • 為避免快取中毒,系統不支援快取 HTTP 414 狀態碼 (URI 過長)。
  • HTTP RFC 7725 所述,HTTP 451 狀態碼 (因法律規定而無法使用) 可用於快取。

如果您需要設定個別狀態碼的 TTL,並覆寫預設行為,可以設定 cdnPolicy.negativeCachingPolicy。這麼做可讓您為 Media CDN 允許的任何狀態碼設定 TTL:300、301、302、307、308、400、403、404、405、410、451、500、501、502、503 和 504。

舉例來說,如要為 HTTP 404 (找不到) 回應設定短暫的 5 秒 TTL,以及為 HTTP 405 (方法不允許) 回應設定 10 秒 TTL,請在每個適用的路徑上使用以下 YAML 定義:

cdnPolicy:
  negativeCaching: true
  negativeCachingPolicy:
    "404": 5s
    "405": 10s
  # other status codes to apply TTLs for

為避免快取中毒,我們不建議為狀態碼 400 (錯誤要求) 或 403 (禁止) 啟用快取功能。請確認原始伺服器只檢查快取鍵中包含的請求元件,並據此傳回其中一個程式碼。例如,當原始伺服器在沒有正確的 Authorization 標頭的情況下,傳回 403 錯誤回應時,就可能發生快取中毒。在這種情況下,快取 403 錯誤回應會導致 Media CDN 為所有後續要求提供 403 錯誤回應,直到 TTL 到期為止,即使要求含有正確的 Authorization 標頭也一樣。

如要停用負面快取,請按照下列步驟操作:

  • 如要停用預設的負面快取行為,請在路線上設定 cdnPolicy.negativeCaching: false。請注意,含有有效快取指令和可快取狀態碼的來源回應仍會快取。
  • 如要避免針對特定狀態碼使用負面快取,但仍遵循來源快取指示,請在 negativeCachingPolicy 定義中省略狀態碼 (cdnPolicy.negativeCachingPolicy[].code)。
  • 如要明確略過特定狀態碼的原始快取指示,請將該狀態碼的 cdnPolicy.negativeCachingPolicy[].ttl 設為 0 (零)。

注意:

  • 如果路徑上已啟用 negativeCaching,且回應定義了有效的快取指令,回應中的快取指令會優先採用。
  • 如果您設定明確的 negativeCachingPolicy,且已為指定的狀態碼定義 TTL,系統一律會使用政策中定義的 TTL。
  • negativeCachingPolicy 設定的 TTL 最大值為 1800 秒 (30 分鐘),但系統會遵循較高 TTL 的來源快取指令。
  • 如果「快取模式」設為 FORCE_CACHE_ALL,系統會一律忽略來源指示。

快取控制指令

這裡定義了 Media CDN 對 Cache-Control 指令的行為。

如果指令不適用於要求或回應 (例如 only-if-cached,這是僅限用戶端的指令),則該欄會標示「不適用」。

指令 要求 回應
no-cache 系統會忽略 no-cache 要求指示,以免用戶端可能啟動或強制重新驗證來源。

回應中含有 no-cache 會快取,但必須先透過來源進行驗證,才能提供。

您可以使用 FORCE_CACHE_ALL 快取模式,針對個別路線覆寫這項設定。

no-store 系統不會快取使用 no-store 的請求回應。

含有 no-store 的回應不會快取。

您可以使用 FORCE_CACHE_ALL 快取模式,針對個別路線覆寫這項設定。

public 不適用

如果系統認為回應整體可快取,且回應也包含 max-ages-maxage 指令,系統就會快取含有 public 指令的回應。

使用 CACHE_ALL_STATIC 快取或 FORCE_CACHE_ALL 模式時,則不需要這麼做。

private 不適用

即使回應在其他情況下可快取,Media CDN 也不會快取含有 private 指令的回應。用戶端 (例如瀏覽器) 可能仍會快取結果。

您可以使用 FORCE_CACHE_ALL 快取模式,針對個別路線覆寫這項設定。

使用 no-store 可避免快取所有回應。

max-age=SECONDS 系統會忽略 max-age 要求指令。系統會傳回快取的回應,就好像要求中未包含此標頭一樣。 含有 max-age 指令的回應會快取至定義的 SECONDS
s-maxage=SECONDS 不適用

含有 s-maxage 指令的回應會快取至定義的 SECONDS

如果同時存在 max-ages-maxage,伺服器會使用 s-maxage

請注意,s-max-age (兩個連字號) 不適用於快取目的。

min-fresh=SECONDS 系統會忽略 min-fresh 要求指令。系統會傳回快取的回應,就好像要求中未包含此標頭一樣。 不適用
max-stale=SECONDS

系統會忽略 max-stale 要求指令。

系統會傳回快取的回應,就好像要求中未包含此標頭一樣。

不適用
stale-while-revalidate=SECONDS 不適用 無效。並在回應中傳遞給用戶端。
stale-if-error=SECONDS 系統會忽略 stale-if-error 要求指令。如果要求中未包含這個標頭,系統會傳回快取的回應。 無效。並在回應中傳遞給用戶端。
must-revalidate 不適用

must-revalidate 回應會在過期後,透過原始伺服器重新驗證。

proxy-revalidate 不適用

proxy-revalidate 的回應會在過期後,透過原始伺服器重新驗證。

immutable 不適用 無效。並在回應中傳遞給用戶端。
no-transform 不適用 Media CDN 不會套用任何轉換。
only-if-cached 系統會忽略 only-if-cached 要求指令。如果要求中未包含這個標頭,系統會傳回快取的回應。 不適用

在可行情況下,Media CDN 會符合 RFC 標準 (HTTP RFC 7234),但會優先最佳化快取卸載作業,並盡可能減少用戶端對命中率和整體來源載入作業的影響。

如採用 HTTP/1.1 Expires 標頭的回應:

  • Expires 標頭的值必須是有效的 HTTP 日期,如RFC 7231 所定義
  • 過去的日期值、無效日期或 0 值表示內容已過期,需要重新驗證。
  • 如果回應中包含 Cache-Control 標頭,Media CDN 會忽略 Expires 標頭。

如果回應中包含 HTTP/1.0 Pragma 標頭,系統會略過該標頭,並將其原封不動地傳遞給用戶端。

快取金鑰

您可以考量如何唯一識別要求,並移除在要求之間可能經常變更的元件,藉此減少 Media CDN 需要聯絡原始來源的次數。這組要求元件通常稱為「快取索引鍵」。

以下各節將說明如何設定快取索引鍵。

快取金鑰元件

快取金鑰是快取物件參照的一組要求參數 (例如主機、路徑和查詢參數)。

根據預設,Edge Cache 服務的快取鍵會包含要求主機、路徑和要求的查詢參數,且範圍限定為特定 EdgeCacheService。

元件 是否預設納入? 詳細資料
通訊協定

透過 HTTP 和 HTTPS 提出的要求會參照相同的快取物件。

如果您想針對 http: 和 https: 要求傳回不同的回應,請在相關路徑上將 cacheKeyPolicy.includeProtocol 設為 true。

主機

不同主機不會參照相同的快取物件。

如果有多個主機名稱指向同一個 EdgeCacheService,且這些主機名稱提供相同內容,請將 cdnPolicy.excludeHost 設為 true。

路徑 一律會納入快取鍵,且無法移除。路徑是快取中物件的最小表示法。
查詢參數

如果查詢參數無法區分不同回應,請將 cacheKeyPolicy.excludeQueryString 設為 true。

如果快取金鑰中只應包含部分查詢參數,請視情況設定 includedQueryParametersexcludedQueryParameters

標題

設定 cacheKeyPolicy.includedHeaderNames 時,請使用要納入快取金鑰的標頭名稱。

指定多個可組合成廣泛值範圍的標頭 (例如,組合標頭值可識別單一使用者),會大幅降低快取命中率,並可能導致淘汰率升高,進而降低效能。

Cookie

設定 cacheKeyPolicy.includedCookieNames 的 Cookie 名稱,以便納入快取金鑰。

指定多個 Cookie 並組合成值的範圍廣泛 (例如,組合 Cookie 值可識別單一使用者),會大幅降低快取命中率,並可能導致淘汰率提高,進而降低效能。

注意事項:

  • 快取鍵不會附加至已設定的來源,因此您可以更新來源設定 (或完全取代來源),而不會有「清除」快取的風險 (例如在供應器之間遷移來源儲存空間時)。
  • 快取鍵會受限於 EdgeCacheService。不同的 EdgeCacheServices 會有不同的快取命名空間,因此即使主機、路徑或其他快取鍵元件相符,您也不會在正式上線、測試前環境和其他測試環境之間不小心快取物件。刪除 EdgeCacheService 後,該服務的所有快取物件都會失效。
  • 快取鍵的範圍並未限定為個別路徑。多個路徑可能會參照相同的快取鍵,特別是如果這些路徑與未包含在快取鍵中的元件相符,例如要求標頭或排除的參數。如果您希望多個路徑共用相同快取,但要傳回不同的回應標頭或 CORS 設定,這項功能就相當實用。
  • 快取鍵不會包含網址重寫設定,舉例來說,快取鍵是根據面向使用者的請求而非最終「重寫」請求。
  • 在路線上設定已簽署的請求時,快取金鑰中不會包含已簽署的屬性。系統會將要求視為 (已簽署) 查詢參數或路徑元件,這些元件以 edge-cache-token 開頭,並以下一個路徑分隔符號 ("/") 結尾,因此不屬於網址的一部分。

包含或排除查詢參數

您可以在特定路徑上,將參數名稱新增至 includedQueryParametersexcludedQueryParameters 快取金鑰設定,藉此在快取金鑰中加入或排除特定查詢參數。

舉例來說,如要將 contentIDcountry 查詢參數納入快取金鑰,並忽略其他所有參數:

cdnPolicy:
  cacheMode: CACHE_ALL_STATIC
  defaultTtl: 86400s
  cacheKeyPolicy:
    includedQueryParameters: ["contentID", "country"]

請務必加入可用於識別內容的查詢參數,並排除其他參數。舉例來說,請排除分析查詢參數、播放工作階段 ID 或其他僅限於用戶端的參數。加入不必要的查詢參數可能會降低快取命中率。

或者,您可以選擇從快取金鑰中排除哪些參數,而非指定要納入快取金鑰的參數。舉例來說,如要從快取鍵中排除特定用戶端的播放 ID 和時間戳記資訊,請設定下列項目:

cdnPolicy:
  cacheMode: CACHE_ALL_STATIC
  defaultTtl: 86400s
  cacheKeyPolicy:
    excludedQueryParameters: ["playback-id", "timestamp"]

針對特定路徑,您可以指定 includedQueryParametersexcludedQueryParameters 其中之一。

如果查詢參數從未用於在各項要求中唯一識別內容,您可以從路徑的快取金鑰中移除所有查詢參數。方法是將 excludeQueryString 設為 true,如下所示:

cdnPolicy:
  cacheMode: CACHE_ALL_STATIC
  defaultTtl: 3600s
  cacheKeyPolicy:
    excludeQueryString: true

如果在路線上啟用已簽署的要求,則查詢字串中不會包含用於簽署的查詢參數,且如果包含這些參數,系統會忽略這些參數。在快取鍵中加入已簽署的參數,可有效地讓每個使用者要求都獨一無二,並要求每項要求都從來源提供。

查詢參數排序

系統會預設排序查詢參數 (查詢字串),以提升快取命中率,因為用戶端可能會重新排序,或以其他方式要求相同的快取物件,但查詢參數的順序不同。

舉例來說,在產生快取金鑰之前,查詢參數 b=world&a=hello&z=zulu&p=parisp=paris&a=hello&z=zulu&b=world 會排序為 a=hello&b=world&p=paris&z=zulu。這可讓兩個要求對應至相同的快取物件,避免對來源提出不必要的要求 (以及來源的回應)。

如果查詢參數鍵有多個例項,且每個例項的值皆不同,系統會依據完整值排序參數 (例如,a=hello 會排在 a=world 之前)。無法停用排序功能。

包含標頭

標頭名稱不區分大小寫,並會由 Media CDN 轉換為小寫。

下列標頭不得納入快取索引鍵:

  • 任何以 access-control- 開頭的標頭
  • 任何以 sec-fetch- 開頭的標頭
  • accept-encoding
  • accept
  • authorization
  • connection
  • content-md5
  • content-type
  • cookie
  • date
  • forwarded
  • from
  • host
  • if-match
  • if-modified-since
  • if-none-match
  • origin
  • proxy-authorization
  • range
  • referer
  • referrer
  • user-agent
  • want-digest
  • x-csrf-token
  • x-csrftoken
  • x-forwarded-for

如要在快取金鑰中納入 HTTP 方法,請使用特殊標頭名稱 :method

納入 Cookie

請注意,Cookie 名稱有大小寫之分。

開頭為 edge-cache- 的 Cookie (不論大小寫) 皆不得用於快取金鑰。

重新驗證、撤銷和到期日

內容傳遞聯播網 (包括 Media CDN) 會盡可能快取最受歡迎的內容,並將內容儲存在最靠近使用者的位置。

Media CDN 的大量儲存空間和來源防護機制,可避免您需要移除不受歡迎的內容。每天存取次數不多的內容可能最終會遭到移除。

  • 快取的回應達到設定的存留時間後,可能不會立即遭到淘汰。針對熱門內容,Media CDN 會向原始來源發出 HEAD 要求,確認標頭未變更,藉此重新驗證快取的回應是否為最新版本。在某些情況下,Media CDN 會改為傳送要求給來源,並附上 If-None-MatchIf-Modified-Since 這兩個要求標頭或其中一個。在這種情況下,如果快取具有該回應的「最新」副本,則正確設定的來源應傳回 HTTP 304 (Not Modified) 回應,但不含主體位元組。
  • 設定 max-ages-maxage 快取指示詞的回應,或是使用TTL 覆寫值指定高 TTL 值 (例如 30 天),可能不會儲存在快取中,系統無法保證物件會在整個期間內儲存在快取中,尤其是如果物件很少被存取的話。

如果您發現遭到淘汰的機率很高,請確認您已設定快取索引鍵,以便排除無法明確識別回應的參數。

其他注意事項

以下考量事項也適用於快取。

Vary 標頭

Vary 標頭代表回應會根據用戶端的要求標頭而改變。如果回應中含有 Vary 標頭,Media CDN 不會快取該標頭,除非標頭指定的標頭已設為快取鍵設定,或指定下列其中一個值:

  • Accept:用於指出用戶端接受的媒體類型
  • Accept-Encoding:用於指出用戶端接受的壓縮類型
  • Available-Dictionary:用於提供可用字典的雜湊,以便壓縮
  • Origin/X-Origin:通常用於跨來源資源共享
  • X-Goog-Allowed-Resources:支援 Google Cloud 機構限制
  • Sec-Fetch-Dest/Sec-Fetch-Mode/Sec-Fetch-Site:用於擷取中繼資料要求標頭

Media CDN 會使用標頭的值做為快取金鑰的一部分,在回應中快取帶有 Vary 標頭的回應。如果回應中的 Vary 標頭含有多個值,系統會依字典順序排序,確保快取鍵是確定性的。

Media CDN 會為特定快取鍵快取最多 100 個變化版本,並隨機從快取中移除超過此限制的變化版本。明確撤銷特定網址或快取代碼的快取時,所有變化版本都會失效。

略過快取

您可以在路線上設定 BYPASS_CACHE 快取模式,有意略過相符要求的快取。如果您需要略過快取,以便處理非必要流量的一小部分,或偵錯來源連線,這項做法就很實用。

如果您需要提供動態回應 (例如 API 後端),建議您設定外部應用程式負載平衡器

建議您一般將這項功能的使用範圍限制在偵錯情境,以免不小心載入來源。略過快取時輸出的流量,會以網際網路輸出費率計價。

快取撤銷

請參閱快取撤銷

位元組範圍要求

Media CDN 支援 RFC 7233 中定義的單部分 HTTP 範圍要求。

此外,Media CDN 也會使用範圍要求,從來源擷取較大的回應。這可讓 Media CDN 個別快取區塊,且不需要一次擷取整個物件來快取。

  • 大於 1 MiB 的物件會以位元組範圍要求 (「區塊」) 擷取,每個區塊最多可達 2 MiB。
  • 可擷取最多 1 MiB 的回應,但不支援原點的位元組範圍。
  • 如果來源不支援位元組範圍,系統就不會提供比這個值大的回應。

原始來源是否支援位元組範圍要求,取決於下列因素:

  • HTTP 狀態碼為 200 (OK) 或 206 (部分內容)。
  • 有效的 Content-LengthContent-Range 回應標頭。
  • 回應驗證工具 (ETagLast-Modified)。

每個「區塊」(位元組範圍) 的個別來源填充要求會記錄為個別記錄項目,並與其父項用戶端要求建立關聯。您可以透過比對 jsonPayload.cacheKeyFingerprint 上的請求,將這些請求分組。

如要進一步瞭解記錄內容,請參閱 Cloud Logging 說明文件

開放式範圍要求

Media CDN 支援「開放式」Range 要求 (例如含有 Range: bytes=0- 的要求),可讓要求持續對應至來源,直到來源關閉回應 (例如來源將所有位元組寫入網路) 或逾時為止。

開放式位元組範圍通常用於要求 Apple 低延遲 HLS 區段的用戶端:由於每個 CMAF 區塊都會寫入網路,CDN 可以將該區塊快取並提交給用戶端。

在其他情況下 (例如不需要與 DASH 互通),媒體播放清單會向播放器指出哪些位元組代表每個區塊:

  #EXTINF:4.08,
  fs270.mp4
  #EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE=20000@0
  #EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE=23000@20000
  #EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE=18000@43000
  #EXT-X-PRELOAD-HINT:TYPE=PART,URI="fs271.mp4",BYTERANGE-START=61000

您可以使用 EdgeCacheOrigin.timeouts.readTimeout 設定值,設定 Media CDN 在讀取之間等待的時間長度。通常應將此值設為目標時間長度的倍數 (例如 2 倍)。

後續步驟