快取詳細資料

可快取性

並非所有 HTTP 回應都可以快取。Cloud CDN 只會快取符合本節中所有條件的回應。其中有些條件是由 RFC 7234 指定,而其他則是 Cloud CDN 特有的條件。

只有在滿足下列所有條件時,回應才能儲存在 Cloud CDN 快取中:

  • 回應是由啟用 Cloud CDN 的後端服務或後端值區提供。
  • 回應是針對 GET 要求做出的回應。
  • 回應的狀態碼為 200203206300301302307410
  • 回應具有 Cache-Control: public 標頭。
  • 回應具有 Cache-Control: s-maxageCache-Control: max-ageExpires 標頭。
  • 回應具有 Content-LengthContent-RangeTransfer-Encoding 標頭。
  • 回應的大小等於或小於大小上限

對於後端值區,有以下幾種方法可以滿足這些需求:

另有一些檢查會封鎖回應的快取。如果滿足以下任一條件,系統就不會快取回應:

  • 回應含有 Set-Cookie 標頭。
  • 回應具有 Vary 標頭且包含 AcceptAccept-EncodingOrigin 以外的值。
  • 回應具有 Cache-Control: no-storeno-cacheprivate 指令。
  • 對應的要求具有 Cache-Control: no-store 指令。

這些條件未來可能會放寬,讓 Cloud CDN 可以快取其他回應。

請注意,如果 Cache-Control: no-storeno-cacheprivate 存在,但系統仍對內容進行快取,這是因為設定了網址簽署。如要深入瞭解如何避免系統快取回應,請參閱阻止快取一節。

大小上限

Cloud CDN 強制要求大小上限,上限會根據原始伺服器是否支援位元組範圍要求而有所差異:

  • 如果原始伺服器支援位元組範圍要求:5 TB (5,497,558,138,880 位元組)
  • 如果原始伺服器不支援位元組範圍要求:10 MB (10,485,760 位元組)

任何內容超過大小上限的回應都不會受到快取。

快取項目

快取金鑰

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 的要求並不相符。

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

  • 通訊協定:可以在金鑰中省略通訊協定。如果省略通訊協定,則 https://example.com/images/cat.jpg 的要求會收到 example.com/images/cat.jpg 的快取金鑰。之後,https://example.com/images/cat.jpghttp://example.com/images/cat.jpg 的要求皆算為該快取項目的相符項目。
  • 主機:可以在金鑰中省略主機。如果省略主機,則 example.comexample2.com 的要求皆會符合相同的快取項目。如果 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 的快取金鑰,這樣 https://example.com/images/cat.jpg?user=user1https://example.com/images/cat.jpg?user=user2 皆會符合相同的項目。您也可以選擇省略或加入部分的查詢字串。

除了加入或省略整個查詢字串外,您還可以選擇透過許可清單和黑名單來使用部分查詢字串。

後端值區的快取金鑰由不含查詢字串的 URI 組成。因此,https://example.com/images/cat.jpghttps://example.com/images/cat.jpg?user=user1https://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 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。如要使用這個選項,您必須加入查詢字串,指定非空白的黑名單,且「不」指定許可清單。

Vary 標頭

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

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

只有在 Vary 標頭具有可快取性一節列出的其中一個值時,系統才會快取含有該標頭的回應。

到期時間與驗證要求

Cloud CDN 中每一個快取項目的到期時間,都是由 Cache-Control: s-maxageCache-Control: max-age 和/或 Expires 標頭依據 RFC 7234 的要求所定義。如果存在多個標頭,則 Cache-Control: s-maxage 優先於 Cache-Control: max-age,且 Cache-Control: max-age 優先於 Expires

當 Cloud CDN 收到要求時,會查詢對應的快取項目並檢查其存在時間。如果快取項目存在且存在時間夠短,就可以從快取提供回應。然而,如果已超過到期時間,Cloud CDN 必須先連線至其中一個後端後才能提供回應。

如果先前已快取的回應具有 Last-Modified 和/或 ETag 標頭,Cloud CDN 可以嘗試使用這些標頭中的資訊,透過後端來驗證快取項目。視是否使用位元組範圍要求來快取回應而定,Cloud CDN 執行這項驗證的方式會略有不同:

  • 如果是使用位元組範圍要求快取回應,Cloud CDN 會發出含有 If-Modified-Since 和/或 If-None-Match 標頭的獨立驗證要求。
  • 如果沒有使用位元組範圍要求,Cloud CDN 會新增 If-Modified-Since 和/或 If-None-Match 標頭至用戶端要求,並將修改後的要求轉送至後端。

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

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

請注意,快取項目的到期時間是快取項目的有效時間長度上限。系統無法保證快取項目在到期之前會一直留在快取中。系統可能會移除不常用內容的快取項目以挪出空間儲存新內容。無論指定的到期時間為何,30 天內不曾存取過的快取項目皆會遭到自動移除。

詳情請參閱移除及到期時間

支援位元組範圍要求

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

  • 回應的狀態碼為 200 OK206 Partial Content
  • 回應具有 Accept-Ranges: bytes 標頭。
  • 回應具有 Content-Length 和/或 Content-Range 標頭。
  • 回應具有包含強驗證工具的 ETag 標頭和/或 Last-Modified 標頭。

Google Cloud Storage 支援大部分物件的位元組範圍要求。然而,除非用戶端要求包含 Accept-Encoding: gzip 標頭,否則 Cloud Storage 針對含有 Content-Encoding: gzip 中繼資料的物件並不支援位元組範圍要求。如果您的 Cloud Storage 物件大小超過 10 MB,請確保物件不含 Content-Encoding: gzip 中繼資料。如需瞭解如何編輯物件中繼資料,請參閱查看及編輯物件中繼資料

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

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

  • 回應內容並不完整,因為用戶端只要求部分內容
  • 回應內容的大小超過 1 MB (1,048,576 位元組)。

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

在快取中找不到所需資料時,快取機制會檢查原始伺服器是否支援位元組範圍要求。如果快取金鑰可以支援位元組範圍要求,快取機制就不會將用戶端要求轉送給 HTTP(S) 負載平衡器,而會針對快取失敗的內容,發出自己的位元組範圍快取填補要求。如果原始伺服器以 206 Partial Content 回應傳回所要求的位元組範圍,則快取就會儲存該範圍以供日後要求使用。

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

Cloud CDN 發出的要求

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

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

在快取中找不到所需資料時,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 值區做為來源時,每個 GET 要求都會當成個別的 B 級作業收費。系統會向您收取 Cloud Storage 處理的所有 GET 要求的費用,包括 Cloud CDN 發出的任何要求。當回應完全是從 Cloud CDN 快取提供時,不會傳送任何 GET 要求給 Cloud Storage,也不會向您收取任何 Cloud Storage 作業的費用。

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

阻止快取

如果不想讓系統將私人資訊快取至 Cloud CDN 快取內容中,請按照下列步驟操作:

  1. 為不應儲存在 Cloud CDN 快取內容或任何快取內容 (甚至是網頁瀏覽器的快取內容) 的回應加入 Cache-Control: private 標頭或 Cache-Control: no-store 標頭。
  2. 網址若提供私人資訊的存取權,則請勿簽署網址。如果可使用已簽署的網址存取內容,無論回應中是否有任何 Cache-Control 指令,系統都有可能快取這類內容。

後續步驟