支援 HTTP 回應標頭

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

本主題說明當您使用 ResponseCache 政策時,Edge 如何處理 HTTP/1.1 快取標頭。Apigee Edge 目前支援部分 HTTP/1.1 快取標頭和指令 (本主題列出不支援的功能),這些指令會從後端目標 (來源) 伺服器接收。

此外,特定標頭 Edge 也會根據其指令採取行動。在某些情況下,這些 HTTP/1.1 快取標頭會覆寫 ResponseCache 政策中指定的任何行為。 舉例來說,如果後端伺服器傳回 Cache-Control 標頭,您可以讓標頭的 s-maxage 指令覆寫政策中的其他到期時間設定。

標題 支援
快取控制 支援從後端原始伺服器傳回的回應,但不支援用戶端要求。Edge 支援部分指令,
效期 支援。可以覆寫。
實體標記 (ETag) If-MatchIf-None-Match 機制的具體行為。
If-Modified-With 在 GET 要求中,即使存在有效的快取項目,標頭仍會傳遞至原始伺服器。
接受-編碼 Edge 會根據傳入標頭傳送壓縮或未壓縮的回應。

Cache-Control

Apigee Edge 僅支援後端來源伺服器傳回的回應 Cache-Control 標頭 (HTTP/1.1 規格允許用戶端要求和來源伺服器回應中的 Cache-Control 標頭)。來源伺服器可包含 Apigee Edge API Proxy 中定義的目標端點,以及使用 TargetServer API 呼叫建立的目標端點。

Cache-Control 支援限制

Apigee Edge 支援 HTTP/1.1 規範中定義的 Cache-Control 回應標頭功能子集。請注意以下事項:

  • Apigee Edge 不支援傳入用戶端要求傳送的 Cache-Control 標頭。
  • Apigee Edge 僅支援公開快取的概念。(根據 HTTP 規格,Cache-Control 可以是公開 (共用) 或私人 (單一使用者)。
  • Apigee Edge 僅支援 HTTP/1.1 規範中 Cache-Control 回應指令的子集。詳情請參閱支援 Cache-Control 回應標頭指令

支援 Cache-Control 回應標頭指令

Apigee 支援針對來源伺服器回應提供的 HTTP/1.1 規格子集指令。下表說明 Apigee Edge 對 HTTP 快取控制回應標頭指令的支援。

如要進一步瞭解此處列出的指令,請參閱 HTTP/1.1 規格中的 Cache-Control 一節。

快取控制指令 Apigee Edge 如何處理指令
cache-extension 不支援。
max-age

如果 ResponseCache 政策將 <UseResponseCacheHeaders> 元素設為 true,系統就會依據這個指令指定的秒數快取回應。

s-maxage 指令覆寫了這個指令,且會覆寫 Expires 標頭。此外,政策的 <ExpirySettings> 元素也可以覆寫標示。詳情請參閱回應快取政策中的「設定快取項目到期時間」和「<UseResponseCacheHeaders>」。

must-revalidate 不支援。所有快取項目到期後,Apigee Edge 就會立即刪除。
no-cache

邊緣會快取來源回應,但必須先透過原始伺服器重新驗證,才能用於滿足任何後續的用戶端要求。這項規則允許來源傳回 304「未修改」回應,以表示應從快取傳回回應,進而儲存傳回完整回應所需的處理程序。如果原始伺服器傳回完整回應,就會取代現有的快取項目。使用這個指令指定的欄位名稱都會遭到忽略。

no-store 不支援。
no-transform 不支援。
private 不支援。如果接收到這個指令,則不會快取來源回應。系統會忽略所有欄位名稱。
proxy-revalidate 不支援。所有快取項目到期後,Apigee Edge 就會立即刪除。
public 即使其他指令另有指示,邊緣也會快取來源回應。根據 HTTP/1.1 規格,當回應包含授權標頭時,這項規則的唯一例外狀況。
s-maxage

如果 ResponseCache 政策將 <UseResponseCacheHeaders> 元素設為 true,系統就會依據這個指令指定的秒數快取回應。

這個指令會覆寫 max-age 指令和 Expires 標頭。如果政策的 <ExpirySettings> 元素可覆寫這個屬性,詳情請參閱回應快取政策中的「設定快取項目到期時間」和「<UseResponseCacheHeaders>」。

到期時間:

當 ResponseCache 政策中的 UseResponseCacheHeaders 標記設為 true 時,Edge 可以使用 Expires 標頭決定快取項目的存留時間 (TTL)。這個標頭指定的日期/時間後,系統會將回應的快取項目視為過時。伺服器可透過這個標頭,在可以根據時間戳記傳回快取值的時機發出通知。

如需 Expires 標頭可接受的日期格式說明,請參閱 HTTP/1.1 規格。例如:

到期日:1994 年 12 月 1 日星期四 16:00:00 GMT

如要進一步瞭解 HTTP 日期/時間格式,請參閱 HTTP/1.1 規格中的日期/時間格式

如要進一步瞭解 Expires 標頭,請參閱 HTTP/1.1 規格中的「標頭欄位定義」一節。

ETag

實體標記 (ETag) 是與要求資源相關聯的 ID。伺服器可以使用 ETag 判斷所要求的資源與相關聯的快取資源是否相符。例如,如果回應與目前快取的內容不符,伺服器可能會重新快取回應。如果 ETag 相符,便可傳回快取的資源。

當目標端點使用 ETag 將回應傳回至 Edge 時,Edge 會快取 ETag 與回應。

如要進一步瞭解實體標記,請參閱 HTTP/1.1 規格中的通訊協定參數

符合條件

使用 If-Match 要求標頭時,如果標頭中的 ETag 與快取的 ETag 相符,則快取實體為最新版本。凡是指定 If-Match 標頭的 GET 以外的要求都會傳遞至原始伺服器,確保所有來源快取設備都有機會處理要求。

如要進一步瞭解 If-Match,請參閱 HTTP/1.1 規格中的標頭欄位定義

如果 Edge 收到來自含有 If-Match 標頭的用戶端的傳入 GET 要求:

如果 Then
If-Match 標頭指定一或多個 ETag
  1. Apigee Edge 會擷取指定資源中所有未過期的快取項目,並將這些快取項目上任何高強度的 ETag 與 If-Match 標頭中指定的項目進行比較。
  2. 如果找到相符項目,就會傳回快取項目。
  3. 如果沒有,要求會傳遞至來源伺服器。
If-Match 標頭指定「*」 要求會傳遞至原始伺服器,確保所有來源快取設施都能處理要求
找到具有相同要求 URI 的快取項目,但其中只包含強度不足的 ETag 原始伺服器必須先重新驗證項目,才能將項目傳回用戶端
ETag 來自原始伺服器。 ETag 不會改變給用戶端

無相符結果

使用 If-None-Match 標頭時,如果標頭中的 ETag 快取的 ETag 「不符」,則快取實體為最新版本。針對包含此標頭的 GET 以外的要求都會傳遞至原始伺服器,

如果 Edge 收到具有此標頭的傳入 GET 要求:

如果 Then
If-None-Match 標頭指定一或多個 ETag
  1. Apigee Edge 會擷取指定 URI 中任何未過期的快取項目,並將這些快取項目上任何高強度的 ETag 與 If-None-Match 標頭中指定的項目進行比較。
  2. 如果找到相符項目,Edge 會傳回「304 未修改」狀態。如果找不到相符項目,Edge 會將要求傳遞至原始伺服器。

If-None-Match 標頭指定「*」,且要求的 URI 有未過期的快取項目

Edge 傳回「304 未修改」狀態
找到具有相同要求 URI 的快取項目,但當中只包含強度不足的 ETag 原始伺服器必須重新驗證項目,Edge 才會將其傳回用戶端
邊緣從原始伺服器收到 ETag ETag 不會改變給用戶端

上次修改時間

如果 Apigee Edge 在 GET 要求中收到 If-Modified-Since 標頭,即使已有有效的快取項目,也會將其傳遞至原始伺服器。

這能確保未透過 Apigee Edge 通過資源的任何更新都會列入計算。如果原始伺服器傳回新實體,Edge 會以新值取代現有的快取項目。如果伺服器傳回「304 未修改」狀態,如果快取回應的 Last-Modified 標頭指出回應尚未變更,Edge 就會傳回回應值。

接受 - 編碼

如果傳入要求包含標頭 Accept-Encoding 且值為 gzipdeflatecompress,來源伺服器就會以壓縮後的資料做出回應。後續要求出現 Accept-Encoding 標頭時,會預期收到未經壓縮的回應。Apigee 的回應快取機制能夠根據傳入標頭,同時傳送已壓縮及未壓縮的回應,而不必回到原始伺服器。

您可以接受附加至快取金鑰的標頭值,讓每個快取項目的金鑰更有意義。詳情請參閱回應快取政策中的「設定快取金鑰」一節。