快取總覽

可快取的回應是指 Cloud CDN 可儲存並快速擷取的 HTTP 回應,因此載入速度較快。並非所有 HTTP 回應都可以快取。

快取模式

您可以透過快取模式,控管 Cloud CDN 用來判斷是否要快取內容的要素。

Cloud CDN 提供三種快取模式,可定義回應的快取方式、Cloud CDN 是否會遵守來源傳送的快取指令,以及快取存留時間的套用方式。

下表列出可用的快取模式:

快取模式 行為
CACHE_ALL_STATIC 自動快取含有靜態內容的成功回應,且該靜態內容在其他情況下並非無法快取。這項模式也會快取已設定有效快取指令的來源回應。

若後端已啟用 Cloud CDN,且是使用 Google Cloud CLI 或 REST API 建立,則會「預設」採用此行為。

USE_ORIGIN_HEADERS 成功的來源回應須設定有效快取指令和有效快取標頭。如果成功的回應不含這些指令,則會從來源轉送。
FORCE_CACHE_ALL 無條件快取成功的回應,覆寫來源所設定的任何快取指令。如果後端提供個別使用者 (可識別使用者身分) 的私人內容,例如動態 HTML 或 API 回應,就不適合使用這個模式。

即使不含有效的快取指令,錯誤回應也可能會快取

將快取模式設為 FORCE_CACHE_ALL 前,請先瞭解下列行為:

  • 如果是已簽署的網址或 Cookie,則透過 Google Cloud 控制台的「Cache entry maximum age」(快取項目存在時間長度上限) 設定或 gcloud --signed-url-cache-max-age 選項所指定的存在時間長度上限,會由 FORCE_CACHE_ALL 覆寫。

  • FORCE_CACHE_ALL 會變更先前快取內容的存留時間 (TTL)。這項變更可能會導致先前視為較新 (因來源標頭的存留時間較長) 的項目變成過時,而先前視為過時的項目則變成較新。

  • FORCE_CACHE_ALL 會覆寫快取指令 (Cache-ControlExpires),但不會覆寫其他來源回應標頭。特別是,即使快取模式為 FORCE_CACHE_ALLVary 標頭仍可能禁止快取。詳情請參閱「Vary 標頭」。

如需設定操作說明,請參閱「設定快取模式」。

靜態內容

靜態內容是指即使由不同使用者存取,內容一律相同。用來設定網站樣式的 CSS、提供互動性的 JavaScript,以及影片和圖片內容,通常不會因指定網址 (「快取金鑰」) 的使用者而異,因此可透過 Cloud CDN 的全球邊緣網路快取。

將快取模式設為 CACHE_ALL_STATIC 時,如果回應的 Cache-ControlExpires 標頭沒有明確的快取指令,Cloud CDN 會「自動」為下列項目快取回應:

  • 網路資產,包括 CSS (text/css)、JavaScript (application/javascript) 和所有網頁字型,包括 WOFF2 (font/woff2)
  • 圖片,包括 JPEG (image/jpg) 和 PNG (image/png)
  • 影片,包括 H.264、H.265 和 MP4 (video/mp4)
  • 音訊檔案,包括 MP3 (audio/mpeg) 和 MP4 (audio/mp4)
  • 格式化文件,包括 PDF (application/pdf)

下表提供摘要資訊。

類別 MIME 類型
網路資產 text/css text/ecmascript text/javascript application/javascript
字型 任何符合 font/*Content-Type
圖片 任何符合 image/*Content-Type
影片 任何符合 video/*Content-Type
音訊 任何符合 audio/*Content-Type
格式化文件類型 application/pdfapplication/postscript

Cloud CDN 會檢查 Content-Type HTTP 回應標頭,該標頭會反映所提供內容的 MIME 類型

注意事項:

  • 來源的網路伺服器軟體必須為每個回應設定 Content-Type。許多網路伺服器會自動設定 Content-Type 標頭,包括 NGINX、Varnish 和 Apache。

  • 使用 Google Cloud 控制台或 Google Cloud CLI 上傳內容時,Cloud Storage 會自動設定 Content-Type 標頭。

  • Cloud Storage 一律會向 Cloud CDN 提供 Cache-Control 標頭。如果沒有明確選擇值,則會傳送預設值。因此,除非您明確調整 Cloud Storage 物件的快取控制中繼資料,或使用 FORCE_CACHE_ALL 模式覆寫 Cloud Storage 傳送的值,否則所有成功的 Cloud Storage 回應都會根據 Cloud Storage 預設值快取。

  • 如要快取 text/htmlapplication/json 內容類型,您必須在回應中設定明確的 Cache-Control 標頭,並注意不要不小心快取某位使用者的資料,然後提供給所有使用者。

如果回應的 MIME 類型可供快取,但 Cache-Control 回應標頭為 privateno-store,或是 Set-Cookie 標頭,則不會快取。詳情請參閱「可快取性規則」。

根據預設,系統不會為成功的回應快取其他內容類型,例如 HTML (text/html) 和 JSON (application/json)。這類回應通常是動態回應,會因使用者而異,例如購物車、含使用者個人化服務的產品頁面,以及已驗證的 API 回應。不過,如果啟用 negative caching,系統仍可能根據特定狀態碼快取這類回應。

Cloud CDN 不會使用網址路徑中的副檔名判斷回應是否可快取,因為許多有效且可快取的回應不會反映在網址中。

可快取的內容

Cloud CDN 會快取符合本節所有條件的回應。部分條件是由 RFC 7234 指定,其他則是 Cloud CDN 特有的條件。

Cloud CDN 可能會定期變更快取內容的確切條件組合。如要明確禁止 Cloud CDN 快取內容,請按照 RFC 7234 的指南,判斷如何指定保證無法快取的回應。另請參閱「根據來源標頭無法快取的內容」一節。

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

屬性 條件
提供者 已啟用 Cloud CDN 的後端服務、後端 bucket 或外部後端
回應對象 GET 要求
狀態碼

200203204206300301302307308404405410421451501

時效性

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

如果可快取的回應沒有存在時間資訊 (例如含有 no-cache),則必須明確提供 public 指令。

使用 CACHE_ALL_STATIC 快取模式時,如果沒有時效性指令,靜態內容類型的成功回應仍可快取。

使用 FORCE_CACHE_ALL 快取模式時,任何成功的回應都可快取。這可能導致個別使用者的私人內容遭到快取。建議您只在不會提供私人或動態內容的後端設定 FORCE_CACHE_ALL,例如 Cloud Storage bucket。

如果啟用 negative caching,且狀態碼符合 negative caching 指定的存留時間,則即使沒有明確的時效性指令,回應仍可快取。

內容

如果是 HTTP/1 來源,回應必須包含有效的 Content-LengthContent-RangeTransfer-Encoding: chunked 標頭。

如果來源使用較進階的 HTTP 通訊協定版本 (HTTP/2 和後續版本),回應就不需具有這類標頭。

大小 小於或等於大小上限

若回應大小介於 10 MiB 和 100 GiB 之間,請參閱「位元組範圍要求」說明的其他可快取性限制。

如果是 Cloud Storage 後端 bucket,請參考以下額外建議:

根據預設,如果是公開物件,且未指定 Cache-Control 中繼資料,則 Cloud Storage 會為物件指派 Cache-Control: public, max-age=3600 標頭。您可以使用 Cache-Control 中繼資料設定不同的值。

如需透過範例瞭解如何設定具備後端 bucket 的外部應用程式負載平衡器,請參閱「使用後端 bucket 設定 Cloud CDN」。

大小上限

Cloud CDN 會強制要求每個回應的大小上限。如果回應的主體超過大小上限,則不會快取,但仍會傳送給用戶端。

大小上限的差異,取決於來源伺服器是否支援位元組範圍要求

來源伺服器支援位元組範圍要求 來源伺服器不支援位元組範圍要求
100 GiB (107,374,182,400 個位元組) 10 MiB (10,485,760 個位元組)

幾乎所有新式網路伺服器 (包括 NGINX、Apache 和 Varnish) 都支援位元組範圍要求。

依來源標頭判定不可快取的內容

有一些檢查會封鎖回應的快取。Cloud CDN 可能會定期變更快取內容的確切條件組合,因此如要明確禁止 Cloud CDN 快取內容,請按照 RFC 7234 標準的指南,判斷如何指定保證無法快取的內容。

如果回應不符合可快取內容的條件,或是符合下列任一條件,Cloud CDN 就不會快取回應。

屬性 條件
提供者 後端服務或外部後端未啟用 Cloud CDN
Cookie Set-Cookie 標頭
Vary 標頭 值不是 AcceptAccept-EncodingAccess-Control-Request-HeadersAccess-Control-Request-MethodOriginSec-Fetch-DestSec-Fetch-ModeSec-Fetch-SiteX-Goog-Allowed-ResourcesX-Origin,也不是設為快取金鑰設定一部分的標頭之一。
回應指令 回應具有 Cache-Control 標頭,其中包含 no-storeprivate 指令 (除非使用 FORCE_CACHE_ALL 快取模式,在該模式下,系統會忽略 Cache-Control 標頭)
要求指令 要求具有 Cache-Control: no-store 指令
要求授權 要求具有 Authorization 標頭,除非由回應 Cache-Control 覆寫
大小 大小大於上限

如果存在 Cache-Control: no-storeprivate,但內容仍遭到快取,可能是下列其中一個原因:

  • 已設定網址簽署。
  • Cloud CDN 快取模式設為強制快取所有回應。

防止快取

如要防止私人資訊遭快取至 Cloud CDN 快取,請按照下列步驟操作:

  1. 確認 Cloud CDN 快取模式未設為 FORCE_CACHE_ALL 模式,該模式會無條件快取所有成功的回應。
  2. 回應具有不應儲存在 Cloud CDN 快取的 Cache-Control: private 標頭,或不應儲存在任何快取 (甚至包含網路瀏覽器快取) 的 Cache-Control: no-store 標頭。
  3. 若網址提供私人資訊的存取權,請勿簽署網址。如果內容可透過已簽署的網址存取,無論回應中是否有任何 Cache-Control 指令,這類內容都有可能快取。
  4. 如果來源 (快取填補) 要求包含 Authorization 要求標頭,且快取模式設為 USE_ORIGIN_HEADERSCACHE_ALL_STATIC 時,Cloud CDN 只會快取含有 publicmust-revalidates-maxage 快取控制指令的回應。這樣做可避免意外快取個別使用者內容和需要驗證的內容。FORCE_CACHE_ALL 快取模式沒有這項限制。

自訂回應標頭

透過自訂回應標頭,您可以指定傳統版應用程式負載平衡器在經 Proxy 處理的回應中新增的標頭。自訂回應標頭可向用戶端反映快取狀態、用戶端地理資料,以及您的靜態回應標頭。

如需操作說明,請參閱「設定自訂回應標頭」。

快取金鑰

Cloud CDN 快取中的各快取項目是根據「快取金鑰」識別。要求進入快取時,快取會將該要求的 URI 轉換成快取金鑰,然後與快取項目的金鑰比較。如果發現相符項目,快取就會傳回與該金鑰相關聯的物件。

對於後端服務,Cloud CDN 預設使用完整的要求 URI 做為快取金鑰。舉例來說,https://example.com/images/cat.jpgcat.jpg 物件特定要求的完整 URI。這個字串會用做預設快取金鑰。只有具備這個確切字串的要求才算相符;具備 http://example.com/images/cat.jpghttps://example.com/images/cat.jpg?user=user1 的要求不算相符。

如果是後端 bucket,快取金鑰預設由 URI 組成,不含通訊協定或主機。根據預設,只有 Cloud Storage 已知的查詢參數會納入快取金鑰 (例如「generation」(代別))。

因此,對於特定後端 bucket,下列 URI 會解析為同一個快取物件:

  • http://example.com/images/cat.jpg
  • https://example.com/images/cat.jpg
  • https://example.com/images/cat.jpg?user=user1
  • http://example.com/images/cat.jpg?user=user1
  • https://example.com/images/cat.jpg?user=user2
  • https://media.example.com/images/cat.jpg
  • https://www.example.com/images/cat.jpg

您可以變更要在快取金鑰中使用哪些部分的 URI。雖然檔案名稱和路徑一律須納入金鑰,但在自訂快取金鑰時,可以加入或省略任何通訊協定、主機或查詢字串的組合。「使用快取金鑰」會說明如何自訂快取金鑰。

URI 部分 自訂 具有相同快取金鑰的網址範例
通訊協定 在快取金鑰中省略通訊協定。
  • https://example.com/images/cat.jpg
  • http://example.com/images/cat.jpg
主機 在快取金鑰中省略主機。
  • https://example.com/images/cat.jpg
  • https://example2.com/images/cat.jpg
查詢字串

在快取金鑰中省略查詢字串。

選擇性省略或納入查詢字串的部分內容。

  • https://example.com/images/cat.jpg?user=user1
  • https://example.com/images/cat.jpg?user=user2

除了納入或省略整個查詢字串外,還可以透過納入和排除清單,使用部分查詢字串。

查詢字串納入清單

您可以選擇控制 Cloud CDN 要納入快取金鑰的查詢字串參數。舉例來說,如果您建立 user 納入清單,則 https://example.com/images/cat.jpg?user=user1&color=blue 會建立 https://example.com/images/cat.jpg?user=user1 快取金鑰,該金鑰也會與 https://example.com/images/cat.jpg?user=user1&color=red 相符。

如要使用這個選項,必須加入查詢字串、指定非空白的納入清單,且「不得」指定排除清單。

Cloud Storage 快取金鑰的查詢字串納入清單

為 Cloud Storage bucket 的快取金鑰納入網址查詢參數,有助支援「快取清除」。即使先前版本仍可根據存留時間設定有效快取,使用者也能透過快取清除,擷取已上傳檔案的新版本。

若快取金鑰是用來從後端 bucket 提供回應,您可以設定納入清單,將查詢字串參數納入快取金鑰。雖然 Cloud Storage 不會根據查詢參數提供不同內容或路由設定,但您可以選擇納入參數,這樣就能清除儲存在 Cloud Storage bucket 的靜態內容快取。

舉例來說,您可以根據基礎內容附加 ?version=VERSION?hash=HASH 查詢參數。這樣一來,您就不必主動使內容失效,且符合新式網頁開發工作流程,也就是網頁框架和網址會使用內容的雜湊值,避免在部署作業中提供過時物件。

由於在快取金鑰納入查詢參數為選用功能,因此 Cloud CDN 不支援從後端 bucket 快取金鑰排除查詢參數。

查詢字串排除清單

您可以透過排除清單,選擇性控管 Cloud CDN 忽略的查詢字串參數。舉例來說,如果建立 user 的排除清單,則快取金鑰會使用所有查詢字串參數,但「不包括」user

設定排除清單並輸入 https://example.com/images/cat.jpg?user=user1&color=blue 後,Cloud CDN 會建立 https://example.com/images/cat.jpg?color=blue 的快取金鑰,該金鑰也會符合 https://example.com/images/cat.jpg?user=user2&color=blue,但不符合 https://example.com/images/cat.jpg?user=user1&color=red

如要使用這個選項,必須加入查詢字串、指定非空白的排除清單,且「不得」指定納入清單。

查詢參數順序

產生的快取金鑰與查詢參數的順序無關。

舉例來說,下列查詢參數會產生相同的快取金鑰:

  • info=123&variant=13e&geography=US
  • geography=US&variant=13e&info=123

HTTP 標頭和 HTTP Cookie 設定

您可以透過下列快取金鑰設定,提升快取命中率和來源卸載作業:

  • 適用於後端服務和 bucket:在快取金鑰設定中加入具名標頭,將 HTTP 標頭用做快取金鑰的一部分。
  • 僅適用於後端服務:使用具名 HTTP Cookie 做為快取金鑰,例如用於 A/B (多變數) 測試、初期測試和類似情境。

如果快取要求包含額外的 HTTP 標頭或 HTTP Cookie,系統會在該快取金鑰的快取位置,快取第三個要求。這可降低高基數標頭或 Cookie 值對快取剔除率的影響。在一般情況和使用者流量條件下,這應該不會造成明顯影響,且有助確保熱門內容維持快取。

納入要求標頭

如要快取其他回應變體,可以在快取金鑰加入其他要求標頭。

部分標頭通常基數很高,因此不允許用於快取金鑰。在大多數情況下,這些標頭的值不是依使用者而異 (CookieAuthorization),就是可能有數千個值 (RefererUser-AgentAccept)。舉例來說,由於瀏覽器、使用者裝置和作業系統種類繁多,User-Agent 標頭可能有超過 5,000 個不重複的值。這類標頭會對快取命中率造成嚴重負面影響。

根據 RFC 7230 規定,系統只接受有效的 HTTP 標頭欄位名稱。標頭欄位名稱不區分大小寫,且不得重複。

您可以視需要設定來源伺服器,在 Vary 回應中加入已設定的快取金鑰要求標頭。不一定要使用 Cloud CDN,但 Cloud CDN 對下游快取很有幫助。詳情請參閱「Vary 標頭」。

Cloud CDN 不允許在標頭清單加入下列標頭:

  • Accept
  • Accept-Encoding
  • Authority,因為此標頭是由設定 (cdnPolicy.includeHost) 控管
  • Authorization,通常依使用者而異,如 OAuth Bearer 權杖
  • CDN-Loop
  • Connection
  • Content-MD5
  • Content-Type
  • Cookie
  • Date
  • Forwarded,通常依用戶端或 Proxy 而異
  • From
  • Host,因為此標頭是由設定 (cdnPolicy.includeHost) 控管
  • If-MatchIf-Modified-SinceIf-None-Match
  • Origin
  • Proxy-Authorization
  • Range
  • Referer (或 Referrer)
  • User-Agent
  • Want-Digest
  • X-CSRFTokenX-CSRF-Token,例如用於 Django 和 Ruby on Rails
  • X-Forwarded-For,通常依用戶端或 Proxy 而異
  • X-User-IP
  • 開頭為下列任一項的標頭:
    • Access-Control-,例如 Access-Control-Request-HeadersAccess-Control-Request-Method
    • Sec-Fetch-
    • Sec-GFE-
    • Sec-Google-
    • X-Amz-
    • X-GFE-
    • X-Goog-
    • X-Google-

在要求標頭使用自訂變數

如需根據個別使用者的裝置和位置提供不同內容,快取金鑰就能派上用場。舉例來說,可以讓回應式網站根據裝置類型,為正在瀏覽內容的使用者顯示適合的圖片,或根據使用者所在位置,設定實用的預設語言。您可以透過自訂要求標頭和自訂變數,定義快取金鑰。

如要在要求標頭使用自訂變數,請按照下列步驟操作:

  1. 為後端服務定義自訂要求標頭。加入一或多個變數,做為自訂要求標頭值。
  2. 更新快取金鑰,使用自訂要求標頭。

如果使用 Cloud CDN,您定義可同時做為自訂要求標頭和快取金鑰標頭的標頭時,只能使用下列變數:

  • device_request_type
  • user_agent_family
  • client_region
  • client_region_subdivision

為維持快取效能,Cloud CDN 會限制變數。這類似於可做為快取金鑰的標頭所受到的限制。

舉例來說,如果可將 X-Lat-Long:{client_city_lat_long} 指定為自訂要求標頭,然後將 X-Lat-Long 新增至快取金鑰標頭集,Cloud CDN 就會嘗試為 client_city_lat_long 的每個值快取一個回應副本。這最終會導致過度使用快取、不必要的內容清除作業,並降低快取命中的回傳率。

基於上述原因,高基數的變數不會納入用於定義自訂要求標頭和後續快取金鑰的變數清單。

標頭相同但值不同

假設使用者傳送多個名稱相同的標頭,但標頭值不同,例如:

My-Header: Value1
My-Header: Value2

在這種情況下,Cloud CDN 會修改要求,假設標頭必須遵循標準慣例,允許部分標頭具有多個值。Cloud CDN 會將這些標頭收合成以半形逗號分隔的清單,並傳送至後端,因此用戶端傳送的內容會如下所示:

My-Header: Value1, Value2

納入具名 Cookie

HTTP Cookie 是 name=value 配對,而要求可包含多個 HTTP Cookie,這些 Cookie 可在同一行內用半形分號分隔,或做為分散的 Cookie 要求標頭,每個標頭各包含一個 Cookie。

清單最多可包含五個 Cookie 名稱。

使用者代理程式 (例如網路瀏覽器) 通常會將每個網域儲存的 Cookie 數量限制為 4 KB,因此務必不要傳送過多 (或過大) 的 Cookie,否則使用者代理程式可能不會傳送要求中的所有 Cookie。這可能會影響使用者是否收到特定快取回應。

如果是從與發布 Cookie 不同的主機名稱提供靜態內容,請確保 Cookie 的 Domain 屬性 (和 Path 屬性) 允許 Cookie 隨靜態內容要求一併傳送。

如果要求包含多個 Cookie 名稱相同的執行個體,系統只會採用第一個執行個體。

快取控制指令

HTTP 快取控制指令會影響 Cloud CDN 的行為,如下表所示。

「不適用」表示指令不適用於要求或回應。

指令 要求 回應
no-store 如果要求中包含這項標頭,Cloud CDN 會遵守這項標頭,且不會將回應儲存在快取。

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

您可以透過 FORCE_CACHE_ALL 快取模式,為每個後端覆寫這項指令。

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

系統會快取含有 no-cache 的回應,但必須先向來源重新驗證,才能提供回應。

您可以透過 FORCE_CACHE_ALL 快取模式,為每個後端覆寫這項指令。

public 不適用

這項指令並非可否快取的必要條件,但如果內容應由 Proxy 快取,最佳做法是加入這項指令。

private 不適用

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

您可以透過 FORCE_CACHE_ALL 快取模式,為每個後端覆寫這項設定。使用 no-store 可避免快取所有回應。

max-age=SECONDS 系統會忽略 max-age 要求指令,並傳回已快取的回應,如同要求中不具有此標頭一樣。 含有 max-age 指令的回應會快取至已定義的 SECONDS
s-maxage=SECONDS 不適用

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

如果 max-ages-maxage 同時存在,Cloud CDN 會使用 s‑maxage

若回應含有這項指令,系統不會提供過時內容。

s-max-age (兩個連字號) 不適用於快取。

min-fresh=SECONDS 系統會忽略 min-fresh 要求指令,並傳回已快取的回應,如同要求中不具有此標頭一樣。 不適用
max-stale=SECONDS

max-stale 要求指令會規定用戶端願意接受的「過時程度」上限 (以秒為單位)。

Cloud CDN 會遵守這項指令,且只在回應的過時程度小於 max-stale 指令時,才會傳回過時的已快取回應。否則,Cloud CDN 會先重新驗證,再提供要求。

不適用
stale-while-revalidate=SECONDS 不適用

執行非同步重新驗證時,最多可在 SECONDS 內向用戶端提供含有 stale-while-revalidate 的回應。

在後端設定 cdnPolicy.serveWhileStale,即可為所有回應啟用這項行為。

stale-if-error=SECONDS 系統會忽略 stale-if-error 要求指令,並傳回已快取的回應,如同要求中不具有此標頭一樣。

此回應標頭沒有任何作用。

must-revalidate 不適用

回應到期後,系統會使用來源伺服器重新驗證含有 must-revalidate 的回應。

若回應含有這項指令,系統不會提供過時內容。

proxy-revalidate

回應到期後,系統會使用來源伺服器重新驗證含有 proxy-revalidate 的回應。

若回應含有這項指令,系統不會提供過時內容。

immutable 不適用 沒有作用。這項指令會在回應中傳遞給用戶端。
no-transform 不適用 Cloud CDN 不會套用任何轉換。
only-if-cached 系統會忽略 only-if-cached 要求指令,並傳回已快取的回應,如同要求中不具有此標頭一樣。 不適用

Cloud CDN 會盡可能遵守 RFC (HTTP RFC 7234),但會優先提升快取卸載作業,並盡量減少用戶端對命中率和整體來源負載的影響。

若是使用 HTTP/1.1 Expires 標頭的回應:

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

回應中存在有效的未來 Expires 標頭,即可快取,不需指定其他快取指令。

如果回應包含 HTTP/1.0 Pragma 標頭,系統會忽略該標頭,依原樣傳遞至用戶端。含有這個標頭的用戶端要求會傳遞至來源,不影響 Cloud CDN 提供回應的方式。

Vary 標頭

Vary 標頭代表回應會根據用戶端的要求標頭而改變。除了要求 URI 外,Cloud CDN 還會遵循來源伺服器在回應中加入的 Vary 標頭。舉例來說,如果回應指定 Vary: Accept,Cloud CDN 會為指定 Accept: image/webp,image/*,*/*;q=0.8 的要求使用一個快取項目,並為指定 Accept: */* 的要求使用另一個快取項目。

如要瞭解允許快取內容的 Vary 標頭,請參閱不可快取的內容相關章節。其他 Vary 標頭值會禁止快取內容。

FORCE_CACHE_ALL 快取模式「不會」覆寫這項行為。Vary 標頭很重要,可避免多個可能來源伺服器回應之間發生快取毒害。如果 FORCE_CACHE_ALL 導致這些回應遭到快取,可能會造成危險。

Vary 標頭有時候會在提供壓縮內容時使用。Cloud CDN 本身不會壓縮或解壓縮回應 (除非啟用動態壓縮),但可以提供已由來源伺服器壓縮的回應。如果來源伺服器依據 Accept-Encoding 要求標頭的值,選擇是否提供壓縮或解壓縮的內容,請確保回應指定 Vary: Accept-Encoding

使用快取金鑰中的 HTTP 標頭時,Cloud CDN 會根據指定要求標頭的值,快取多個回應副本;這類似於 Vary 支援功能,但來源伺服器不必明確指定任何 Vary 回應標頭。如果來源伺服器在 Vary 回應中指定快取金鑰標頭,Cloud CDN 會正確處理該回應,如同 Vary 回應未提及標頭的情況。

到期時間與驗證要求

快取項目的到期時間會定義快取項目的有效時間長度。s-maxage (或 max-age/expires) 值可自動重新驗證由使用者產生的過時快取內容。

Cloud CDN 收到要求時,會查詢對應的快取項目,並檢查項目存在時間。如果快取項目存在且夠新,就可以從快取提供回應。如已到期,Cloud CDN 會聯絡其中一個後端,嘗試重新驗證快取項目。這項驗證會在提供回應前執行;除非您啟用 serve-while-stale,則系統會以非同步方式重新驗證。

在某些快取模式中,您可以設定存留時間值。詳情請參閱「使用存留時間設定和覆寫」。

快取模式會影響時效性的判斷方式。

快取模式 驗證行為
CACHE_ALL_STATIC 系統會參考來源標頭 (Cache-Control: s-maxageCache-Control: max-ageExpires 標頭),判斷時效性。如果是靜態內容,沒有來源標頭時,會根據設定的 default_ttl 判斷時效性。靜態內容的存留時間超過 default_ttl 後,Cloud CDN 會重新驗證內容。
USE_ORIGIN_HEADERS Cloud CDN 快取中各快取項目的到期時間,是由 Cache-Control: s-maxageCache-Control: max-ageExpires 標頭依據 RFC 7234 所定義。
FORCE_CACHE_ALL 判斷時效性的依據是所設定的 default_ttl,而非來源標頭。內容存留時間超過 default_ttl 後,Cloud CDN 會重新驗證內容。

如有多個標記,Cache-Control: s-maxage 的優先順序高於 Cache-Control: max-age,而 Cache-Control: max-age 的優先順序高於 Expires

根據預設,如果到期時間值超過 30 天 (2,592,000 秒),Cloud CDN 會將到期值視為 2,592,000 秒。即使超過 30 天,下游用戶端仍會看到 max-ages-maxage 的準確值。

剔除

快取項目並不保證會在快取中保留至到期,因為不熱門的項目「隨時」可能在到期前遭到清除,為新內容騰出空間。保留時間上限為 30 天,屆時未曾存取的快取項目皆會自動剔除。

詳情請參閱「剔除及到期時間」。

使用條件式要求執行驗證

Cloud CDN 可能會嘗試使用快取回應標頭中的資訊,透過後端驗證快取項目。符合下列兩項條件,就會發生上述情形:

  • 先前快取的回應含有 Last-ModifiedETag 標頭。
  • 用戶端要求屬於 GET 要求,但不含 If-Modified-SinceIf-None-Match 標頭。

Cloud CDN 執行這項驗證的方式略有不同,具體取決於快取回應時是否使用位元組範圍要求

  • 如果是透過位元組範圍要求快取回應,Cloud CDN 會發出包含 If-Modified-SinceIf-None-Match 標頭的個別驗證要求。
  • 否則,Cloud CDN 會在用戶端要求中加入 If-Modified-SinceIf-None-Match 標頭,並將修改過的要求轉送至後端。

如果快取的副本仍為最新版本,後端可傳送 304 Not Modified 回應,驗證現有的快取項目。在這種情況下,後端只會傳送回應標頭,而不會傳送回應主體。Cloud CDN 會在快取中插入新的回應標頭、更新到期時間,並將新的回應標頭和快取的回應主體提供給用戶端。

如果先前快取的回應沒有 Last-ModifiedETag 標頭,Cloud CDN 會忽略到期的快取項目,並將用戶端要求轉送至後端,且不會修改要求。

支援位元組範圍要求

若回應符合下列條件,表示來源伺服器支援位元組範圍要求:

  • 狀態碼:200 OK206 Partial Content
  • 標頭:Accept-Ranges: bytes
  • 標頭:Content-Length;如果是 206 Partial Content 回應,則為 Content-Range 值,代表來源物件的完整長度。舉例來說,Content-length: 0-100/999 可快取,但 Content-length: 0-100/* 不可快取。
  • 標頭:Last-ModifiedETag,並搭配強驗證工具。

Cloud Storage 支援大部分物件的位元組範圍要求。不過,除非用戶端要求包含 Accept- Encoding: gzip 標頭,否則對於含有 Content-Encoding: gzip 中繼資料的物件,Cloud Storage 不支援位元組範圍要求。如果 Cloud Storage 物件大於 10 MB,請確認這些物件沒有 Content-Encoding: gzip 中繼資料。如要瞭解如何編輯物件中繼資料,請參閱「查看及編輯物件中繼資料」。

常見的網路伺服器軟體也支援位元組範圍要求。如要瞭解如何啟用支援功能,請參閱網路伺服器的說明文件。如要進一步瞭解位元組範圍要求,請參閱 HTTP 規格說明文件

來源伺服器支援位元組範圍要求時,如果符合下列任一條件,Cloud CDN 快取會在第一次收到要求時,拒絕儲存可快取的回應:

  • 回應主體不完整,因為用戶端只要求部分內容。
  • 回應主體大於 1 MB (1,048,576 個位元組)。

如果發生這種情況,且回應符合一般可快取性條件時,快取會記錄來源伺服器支援該快取金鑰的位元組範圍要求,並將來源伺服器的回應轉送至用戶端。

快取失敗時,快取會檢查來源伺服器是否支援位元組範圍要求。如果已知快取金鑰支援位元組範圍要求,快取就不會將用戶端要求轉送至外部應用程式負載平衡器,而會自行發出位元組範圍快取填補要求,填補缺少的內容。

Cloud CDN 自行發出位元組範圍快取填補要求時,來源伺服器會傳回 206 Partial Content 回應。如要在快取時考量 206 Partial Content 回應,回應必須包含 Content-Range 標頭,以及不含星號的 complete-length 指令,例如 0-100/999。接著,Cloud CDN 會快取傳回的 206 Partial Content 回應,並用於回覆日後用戶端對該內容的要求。

只有當快取收到 206 Partial Content 回應的目的,是為了回覆快取所發出的位元組範圍要求時,快取才會儲存此回應。除非快取先前的記錄顯示,來源伺服器支援該快取金鑰的位元組範圍要求,否則快取不會發出位元組範圍要求;因此在大小超過 1 MB 的內容發生第二次存取後,指定的快取才會儲存該內容。

由於 Cloud CDN 的分散式特性,Cloud CDN 有時可能會多次從來源擷取各位置的最後一個區塊。這只會影響各快取金鑰的前幾項要求。

要求收合 (合併)

要求收合 (也稱為「合併」) 會主動將相同快取金鑰的多個使用者導向快取填補要求,依照各邊緣節點收合成單一來源要求。這項功能可主動降低來源的負載,且同時適用於「項目」要求 (直接擷取的回應),以及「區塊」要求,即 Cloud CDN 會使用 Range 要求,更有效率地擷取較大的物件。

要求收合功能預設為啟用。

已收合要求的行為如下:

  • 已收合要求會記錄面向用戶端的要求,以及 (已收合) 快取填補要求。
  • 系統會使用已收合工作階段的「領先要求」發出來源填補要求。
  • 不屬於快取金鑰的要求屬性 (例如 User-AgentAccept-Encoding 標頭),只會反映已收合工作階段的「領先要求」
  • 快取金鑰不同的要求無法收合。

下圖說明要求如何合併:

已啟用要求收合功能的 Cloud CDN。
已啟用要求收合功能的 Cloud CDN (按一下即可放大)。

相較之下,如果停用要求收合功能,或要求無法合併,來源要求和「回應」的數量可能等於嘗試擷取未快取物件的用戶端數量。

未啟用要求收合功能的 Cloud CDN。
未啟用要求收合功能的 Cloud CDN (按一下即可放大)。

所有類型的要求皆會預設啟用收合功能。您可以停用項目要求類型的收合功能。在極易受延遲影響的情境 (例如廣告放送),建議停用項目要求的收合功能,因為這類情境不需考量來源負載。

下表概略說明不同要求類型的預設行為,以及是否可自行設定。

要求類型 預設行為 可自行設定 收合的好處
區塊要求 已啟用 可大幅降低來源頻寬
項目要求 已啟用 可減少來源要求數量

如要使用 Google Cloud CLI,為參照 Cloud Storage bucket 的後端 bucket「停用」項目要求收合功能,請執行下列指令:

gcloud

使用 gcloud compute backend-servicesbackend-buckets 指令:

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --no-request-coalescing

如要使用 Google Cloud CLI,在後端 bucket 啟用項目要求收合功能,請執行下列指令:

gcloud

使用 gcloud compute backend-buckets 指令:

gcloud compute backend-buckets update BACKEND_BUCKET_NAME \
    --request-coalescing

如要使用 Google Cloud CLI,為後端服務 (包括 VM 群組和外部後端) 啟用項目要求收合功能,請執行下列指令:

gcloud

使用 gcloud compute backend-services 指令:

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --request-coalescing

Cloud CDN 發出的要求

如果來源伺服器支援位元組範圍要求,Cloud CDN 可傳送多個要求到來源伺服器,藉此回應單一用戶端要求。Cloud CDN 可發出兩種類型的要求:驗證要求和位元組範圍要求。

如果回應指出,來源伺服器支援特定快取金鑰的位元組範圍要求,但要求已到期,Cloud CDN 就會發出驗證要求,確認內容是否不曾變更,以及來源伺服器是否仍支援該內容的範圍要求。如果來源伺服器的回應是 304 Not Modified,Cloud CDN 就會繼續使用位元組範圍提供內容。否則,Cloud CDN 會將來源伺服器的回應轉送給用戶端。您可以使用 Cache-ControlExpires 回應標頭控制到期時間。

快取失敗時,Cloud CDN 會針對與用戶端要求重疊的一組位元組範圍,發出快取填補要求。如果快取中有用戶端所要求的部分內容範圍,Cloud CDN 會從快取提供所擁有的內容,然後只針對遺漏的範圍,傳送位元組範圍要求給來源伺服器。

由 Cloud CDN 發出的每個位元組範圍要求會各指定一個範圍,該範圍會從 2,097,136 個位元組倍數的偏移位置開始。每個範圍的大小也會是 2,097,136 個位元組,但最終範圍可能例外;如果內容不是該大小的倍數,最終範圍會較小。位元組範圍要求中使用的大小和偏移可能會在日後變更。

舉例來說,試想用戶端要求 1,000,000 到 3,999,999 個位元組的內容不在快取中。在此範例中,Cloud CDN 會發出兩個 GET 要求,一個要求取得第一個 2,097,136 位元組的內容,另一個要求取得第二個 2,097,136 位元組的內容。這會產生 4,194,272 個位元組的快取填補,即使用戶端只要求了 3,000,000 個位元組。

您使用 Cloud Storage bucket 做為來源時,每個 GET 要求都會當成個別的 B 級作業計費。系統向您收取的費用會計入 Cloud Storage 處理的所有 GET 要求,包括 Cloud CDN 發出的要求。如果回應完全來自 Cloud CDN 快取,GET 要求就不會傳送至 Cloud Storage,您也不必支付任何 Cloud Storage 作業的費用。

Cloud CDN 發出驗證要求或位元組範圍要求時,並不會納入用戶端專用標頭,例如 CookieUser-Agent

在 Cloud Logging httpRequest.userAgent 欄位,Cloud-CDN-Google 表示要求是由 Cloud CDN 發出。

略過快取

快取略過功能可讓含有特定要求標頭的要求略過快取,即使內容先前已快取也一樣。

本節說明如何使用 HTTP 標頭略過快取,例如 PragmaAuthorization。如要確保使用者或客戶一律從來源伺服器擷取最新內容,這項功能就非常實用。您可能需要執行這項操作,才能測試、設定暫存目錄或指令碼。

如果指定標頭相符,系統會略過所有快取模式設定的快取,即便是 FORCE_CACHE_ALL 也不例外。如果指定標頭是許多要求共用的標頭,略過快取會導致大量快取失敗。

事前準備

  • 確認已啟用 Cloud CDN;如需操作說明,請參閱「使用 Cloud CDN」。

  • 視需要更新至最新版本的 Google Cloud CLI:

    gcloud components update
    

設定快取略過功能

最多可指定五個 HTTP 標頭名稱。資料值不區分大小寫。標頭名稱必須是有效的 HTTP 標頭欄位權杖。標頭名稱不得在新增標頭清單中出現超過一次。如要瞭解有效標頭名稱的規則,請參閱「自訂標頭的運作方式」。

控制台

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

    前往「Load balancing」(負載平衡)

  2. 按一下外部應用程式負載平衡器的名稱。
  3. 按一下「Edit」(編輯)
  4. 在「Backend configuration」(後端設定) 中選取後端,然後按一下「Edit」(編輯)
  5. 確認已選取「Enable Cloud CDN」(啟用 Cloud CDN)
  6. 按一下視窗底部的「Advanced configurations」(進階設定)
  7. 在「Bypass cache on request header」(略過要求標頭快取程序) 下方,按一下「Add header」(新增標頭)
  8. 輸入標頭名稱,例如 PragmaAuthorization
  9. 按一下「Update」(更新)
  10. 再按一下「Update」(更新)

gcloud

如為後端 bucket,請使用 gcloud compute backend-buckets creategcloud compute backend-buckets update 指令,並加上 --bypass-cache-on-request-headers 旗標。

如為後端服務,請使用 gcloud compute backend-services creategcloud compute backend-services update 指令,並加上 --bypass-cache-on-request-headers 旗標。

gcloud compute backend-buckets (create | update) BACKEND_BUCKET_NAME
    --bypass-cache-on-request-headers=BYPASS_REQUEST_HEADER
gcloud compute backend-services (create | update) BACKEND_SERVICE_NAME
    --bypass-cache-on-request-headers=BYPASS_REQUEST_HEADER

例如:

gcloud compute backend-services update my-backend-service
    --bypass-cache-on-request-headers=Pragma
    --bypass-cache-on-request-headers=Authorization

API

如為後端 bucket,請使用 Method: backendBuckets.insertMethod: backendBuckets.updateMethod: backendBuckets.patch API 呼叫。

如為後端服務,請使用 Method: backendServices.insertMethod: backendServices.updateMethod: backendServices.patch API 呼叫。

例如:

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets

在 JSON 要求主體新增下列程式碼片段:

"cdnPolicy": {
  "bypassCacheOnRequestHeaders": [
    {
      "headerName": string
    }
  ]
}

停止略過快取

gcloud

如為後端 bucket,請使用 gcloud compute backend-buckets creategcloud compute backend-buckets update 指令,並加上 --no-bypass-cache-on-request-headers 旗標。

如為後端服務,請使用 gcloud compute backend-services creategcloud compute backend-services update 指令,並加上 --no-bypass-cache-on-request-headers 旗標。

gcloud compute backend-services (create | update) (BACKEND_SERVICE_NAME | BACKEND_BUCKET_NAME)
    --no-bypass-cache-on-request-headers

API

如為後端 bucket,請使用 Method: backendBuckets.insertMethod: backendBuckets.update API 呼叫。

如為後端服務,請使用 Method: backendServices.insertMethod: backendServices.update API 呼叫。

請使用下列其中一個 API 呼叫:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE

在 JSON 要求主體新增下列程式碼片段:

"cdnPolicy": {
  "fields": "bypassCacheOnRequestHeaders"
}

後續步驟

  • 如要瞭解快取模式如何簡化內容快取作業,請參閱「使用快取模式」。
  • 如要為 HTTP(S) 達到負載平衡的執行個體和儲存空間 bucket 啟用 Cloud CDN,請參閱「使用 Cloud CDN」。
  • 如要瞭解如何撤銷快取,請參閱「快取撤銷總覽」。
  • 如要查看 GFE 網路連接點,請參閱「快取位置」。