設定快取行為

Media CDN 會使用 Google 的全球邊緣快取基礎架構來快取內容,並減少來源基礎架構的負載,盡可能提供和使用者息息相關的內容。

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

可快取性

下列各節說明 Media CDN 會快取哪些回應,以及如何提升快取卸載量。

預設快取行為

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

  • CACHE_ALL_STATIC 的預設快取模式:

    • 遵守來源快取指令,例如 Cache-ControlExpires,最高可達可設定的存留時間上限。
    • 如果沒有原始快取指令,系統會自動快取靜態媒體類型,預設 TTL 為 3600 秒。
    • 快取 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 超過快取存留時間時重新驗證。

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

來源規定

如要允許 Media CDN 快取大於 1 MiB 的原始伺服器回應,原始伺服器必須在 HEADGET 要求的相關回應標頭中加入下列項目 (除非另有規定):

  • Last-Modified ETag HTTP 回應標頭 (驗證器)。
  • 有效的 HTTP Date 標頭。
  • 有效的 Content-Length 標頭。
  • Content-Range 回應標頭,用來回應 Range GET 要求。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 標頭。

具有 Vary 標頭,但不是 AcceptAccept-EncodingOriginX-OriginX-Goog-Allowed-ResourcesSec-Fetch-DestSec-Fetch-ModeSec-Fetch-Site

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 指令)。
  • 為避免系統快取非成功回應的時間超出預期,非 2xx (非成功) 狀態碼不會根據 Content-Type (MIME 類型) 快取,也不會套用預設存留時間。

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

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

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

靜態內容包括影片、音訊、圖片,以及 Content-Type 回應標頭中 MIME 類型定義的常見網頁素材資源。

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 類型可供快取,但具有 Cache-Control 回應指令 privateno-storeSet-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 標頭,系統會使用該標頭,而非此處的預設存留時間值。

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

CACHE_ALL_STATIC

FORCE_CACHE_ALL

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

CACHE_ALL_STATIC

FORCE_CACHE_ALL

如果將任何存留時間值設為零 (0 秒),系統會在提供回應前,重新驗證每個要求與來源的關係,如果設定範圍過廣,會增加來源的負載。

如果快取模式設為 Use Origin Headers,就無法設定 TTL,因為 Media CDN 會依據來源來決定行為。

注意:

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

負面快取

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

這樣一來,您就能在更靠近使用者的位置快取錯誤回應,例如重新導向 (HTTP 301 和 308) 和找不到 (HTTP 404) 回應,如果回應不太可能變更且可以快取,還能更廣泛地減少原始負載。

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

狀態碼 原因描述 存留時間
HTTP 300 多個選擇 10 分鐘
HTTP 301HTTP 308 永久重新導向 10 分鐘
HTTP 404 找不到 120 秒
HTTP 405 找不到方法 60 秒
HTTP 410 消失 120 秒
HTTP 451 因法律要求而遭拒 120 秒
HTTP 501 未執行 60 秒

預設的負向快取代碼集與 HTTP RFC 9110 中描述的啟發式可快取狀態碼相符,但有以下例外狀況:

  • 為避免快取中毒,快取功能不支援 HTTP 狀態碼 414 (URI Too Long)。
  • HTTP RFC 7725 所述,系統支援 HTTP 狀態碼 451 (因法律要求而遭拒) 的快取。

如要設定自己的每個狀態碼存留時間,並覆寫預設行為,可以設定 cdnPolicy.negativeCachingPolicy。您可以為 Media CDN 允許的任何狀態碼設定 TTL:300、301、302、307、308、400、403、404、405、410、451、500、501、502、503 和 504。

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

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

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

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

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

注意:

  • 在路徑上啟用 negativeCaching 時,如果回應定義了有效快取指令,回應中的快取指令會優先採用。
  • 如果您設定明確的 negativeCachingPolicy,且已為指定狀態碼定義存留時間,系統一律會使用政策中定義的存留時間。
  • 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 聯絡來源的次數,請考量哪些項目可做為要求的專屬 ID,並移除要求之間可能經常變更的元件。這組要求元件通常稱為「快取金鑰」。

下列各節說明如何設定快取金鑰。

快取金鑰元件

快取鍵是一組要求參數 (例如主機、路徑和查詢參數),快取物件會透過這些參數參照。

根據預設,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 的值組合範圍很大 (例如,組合後的 Cookie 值可識別單一使用者),快取命中率就會大幅降低,且可能導致逐出率提高和效能降低。

注意事項:

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

納入或排除查詢參數

如要將特定查詢參數納入或排除在快取金鑰之外,請在特定路徑的 includedQueryParametersexcludedQueryParameters 快取金鑰設定中加入參數名稱。

舉例來說,如要將 contentIDcountry 查詢參數納入快取金鑰,並忽略所有其他參數,請使用下列語法:

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

請務必加入可明確識別內容的查詢參數,並排除無法識別內容的查詢參數。舉例來說,您可以排除 Analytics 查詢參數、播放工作階段 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 要求,確認標頭未變更,藉此重新驗證快取回應是否為最新版本。
  • 如果回應設定 max-ages-maxage 快取指令,或使用存留時間覆寫指定高存留時間值 (例如 30 天),則可能不會在快取中儲存完整存留時間。無法保證物件會儲存在快取中一段時間,尤其是存取頻率不高的物件。

如果逐出率偏高,請確認您已設定快取鍵,排除無法明確識別回應的參數。

其他注意事項

快取也可能適用下列注意事項。

Vary 標頭

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

  • Accept:用於指出用戶端接受的媒體類型
  • Accept-Encoding:用於指出用戶端接受的壓縮類型
  • Available-Dictionary:用於提供可用字典的雜湊,以進行壓縮
  • 來源/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 9110 中定義的 HTTP 範圍要求。

此外,Media CDN 會使用範圍要求,從來源擷取較大的回應。這樣一來,Media CDN 就能快取個別位元組範圍,不必一次擷取整個物件進行快取。

  • 系統會以位元組範圍要求擷取大於 1 MiB 的物件,每個要求最多 2 MiB。
  • 擷取的回應大小上限為 1 MiB,且來源不支援位元組範圍。
  • 如果來源不支援位元組範圍,系統就不會提供大於 1 MiB 的回應。

原始伺服器是否支援位元組範圍要求取決於下列因素:

  • HTTP 狀態碼為 200 (OK) 或 206 (Partial Content)。
  • 有效的 Content-LengthContent-Range 回應標頭。
  • 回應驗證器 (ETagLast-Modified)。

系統會將每個位元組範圍的個別來源填滿要求記錄為離散記錄項目,並與其上層用戶端要求建立關聯。您可以比對每項要求的 jsonPayload.cacheKeyFingerprint 值,將這些要求分組。

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

多部分範圍要求

媒體 CDN 支援多部分範圍要求,讓使用者在單一 HTTP 要求中,要求檔案的多個不連續片段,例如 Range: bytes=0-499, 1000-1499

為盡量提升用戶端效能並卸載原始伺服器,Media CDN 可以從快取提供所要求的個別位元組範圍,並將這些範圍整合成單一回應,連同 HTTP 206 Partial Response 狀態碼傳送給用戶端,且 Content-Type 設為 multipart/byteranges

如果是可快取的回應,當用戶端要求多部分範圍時,Media CDN 會將要求轉換為一組單一部分範圍要求,藉此最佳化程序。每個要求的大小為 2 MB,可涵蓋用戶端要求的所有位元組範圍部分。然後,Media CDN 會使用這些回應,在邊緣產生單一的多部分回應。這種做法可有效運用快取、減少多餘的原始擷取作業,並支援大量使用案例,例如應用程式商店下載和 OS 更新。

對於無法快取的內容,Media CDN 會直接將要求轉送至來源。

開放式範圍要求

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

要求 Apple Low-Latency 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 倍)。

後續步驟