跳至內容

當我設定自訂物件快取時,為什麼我的 CloudFront 發行項目會使用來源的快取設定?

2 分的閱讀內容
0

我想對當我設定自訂物件快取時,Amazon CloudFront 發行項目會使用來源的快取設定進行疑難排解。

簡短描述

自訂物件快取時,您可以設定預設存留時間 (預設 TTL)、最小 TTL 和最大 TTL

CloudFront 會使用以下行為:

  • 如果來源未傳回快取標頭,則 CloudFront 發行項目將使用預設 TTL
  • 如果來源傳回的快取標頭低於最小 TTL,則發行項目將使用最小 TTL
  • 如果來源傳回的快取標頭大於最大 TTL,則發行項目將使用最大 TTL

注意:即使 CloudFront 根據最小 TTL最大 TTL 來快取回應,對用戶端的回應仍包含來源的快取標頭。所有私有快取 (例如瀏覽器或 Proxy) 都可以使用來源的快取標頭。

如果您的發行項目不是根據預設 TTL 值進行快取,請確認來源的快取標頭不衝突。

解決方法

識別衝突的快取標頭

確認來源的快取標頭是否與發行項目的自訂物件快取衝突。

最小 TTL 和預設 TTL 設定為 0,但仍有來自 CloudFront 的快取結果

檢查來自 CloudFront 的回應,確認 X-Cache 的值是 Hit from cloudfront 還是 RefreshHit from cloudfront

< HTTP/1.1 200 OK
< Content-Type: text/html
< Content-Length: 437
< Connection: keep-alive
< Date: Sat, 03 Feb 2018 19:26:45 GMT
< Last-Modified: Sat, 03 Feb 2018 19:25:24 GMT
< ETag: "example12345abcdefghijklmno54321"
< Cache-Control: max-age=300, Public
< Accept-Ranges: bytes
< Server: AmazonS3
< Age: 14
< X-Cache: Hit from cloudfront

如果 X-CacheHit from cloudfrontRefreshHit from cloudfront,則表示請求來自邊緣節點的快取。在重新整理命中時,CloudFront 會向來源重新驗證已過期物件是否未修改,若物件過時,則進行重新整理。

檢查回應中的 Cache-ControlExpiresAge 值。如果 Cache-Controlmax-age 值大於 Age 的值,則快取的回應來自 CloudFront 快取。如果到期日期仍在未來,則快取的回應也不會過時。這是預期行為,即使快取行為路徑的最小 TTL預設 TTL 設定為 0。

**注意:**在上述範例中,最大 TTL 大於 0。當所有 TTL 值都設定為 0 時,快取會關閉。

最大 TTL 和預設 TTL 大於 0,但 CloudFront 存在未命中

檢查來自 CloudFront 的回應,確認 X-Cache 的值是否為 Miss from cloudfront

< HTTP/1.1 200 OK
< Content-Type: text/html
< Content-Length: 437
< Connection: keep-alive
< Date: Sat, 03 Feb 2018 19:26:45 GMT
< Last-Modified: Sat, 03 Feb 2018 19:25:24 GMT
< ETag: "example12345abcdefghijklmno54321"
< Cache-Control: no-cache, no-store
< Accept-Ranges: bytes
< Server: AmazonS3
< X-Cache: Miss from cloudfront

如果 X-CacheMiss from cloudfront,則表示請求來自來源,而不是快取。

如果 Cache-Control 值為 no-store,則標頭會指示 CloudFront 不快取回應。如果 Cache-Controlno-cache,則標頭會指示 CloudFront 在傳回快取回應之前,先向來源驗證內容。如果 Cache-Controlprivate,則 CloudFront 應僅將回應儲存在私有快取中,例如瀏覽器的本機快取。

這些行為會覆寫最大 TTL預設 TTL 設定。

**注意:**非快取的回應不會包含 Age 標頭。

在上述範例中,最小 TTL 設定為 0。如果最小 TTL 大於 0,則 CloudFront 會快取該物件,即使回應具有 no-cacheno-storeprivate 命令。如需詳細資訊,請參閱指定 CloudFront 快取物件的時間

CloudFront 快取錯誤回應

CloudFront 會將錯誤回應從來源轉送到用戶端,並預設快取來源的錯誤回應 10 秒。

如果來源的錯誤回應包含 Cache-Control 標頭,則 CloudFront 會使用相關 TTL 快取錯誤,而不是使用預設的 10 秒。

若要檢查錯誤回應是來自來源還是 CloudFront,請查看 Server 值。若要檢查錯誤是否為快取回應,請查看回應是否包含 Age 標頭。

下列範例顯示來自 Amazon Simple Storage Service (Amazon S3) 來源的錯誤,且為快取回應:

< HTTP/1.1 403 Forbidden
< Content-Type: application/xml
< Transfer-Encoding: chunked
< Connection: keep-alive
< Date: Sat, 03 Feb 2018 21:07:51 GMT
< Server: AmazonS3
< Age: 12
< X-Cache: Error from cloudfront

以下範例顯示來自 CloudFront 的錯誤,且非快取回應:

< HTTP/1.1 403 Forbidden
< Server: CloudFront
< Date: Sat, 03 Feb 2018 21:14:53 GMT
< Content-Type: text/xml
< Content-Length: 146
< Connection: keep-alive
< X-Cache: Error from cloudfront

更新來源

在您確定會覆寫發行項目的自訂物件快取的快取標頭後,請更新來源。

請完成下列步驟:

  1. 確定 Web 伺服器組態中標頭的位置。
  2. 移除套用標頭的行。
  3. 重新啟動伺服器。
  4. 測試您的來源,確認回應中不再包含快取標頭。
  5. 在整個 CloudFront 發行項目上執行無效驗證,以套用變更。

相關資訊

根據請求標頭快取內容

管理內容在快取中的存留時間 (過期時間)

AWS 官方已更新 10 個月前