Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
當我設定自訂物件快取時,為什麼我的 CloudFront 發行項目會使用來源的快取設定?
我想對當我設定自訂物件快取時,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-Cache 為 Hit from cloudfront 或 RefreshHit from cloudfront,則表示請求來自邊緣節點的快取。在重新整理命中時,CloudFront 會向來源重新驗證已過期物件是否未修改,若物件過時,則進行重新整理。
檢查回應中的 Cache-Control、Expires 和 Age 值。如果 Cache-Control 的 max-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-Cache 為 Miss from cloudfront,則表示請求來自來源,而不是快取。
如果 Cache-Control 值為 no-store,則標頭會指示 CloudFront 不快取回應。如果 Cache-Control 為 no-cache,則標頭會指示 CloudFront 在傳回快取回應之前,先向來源驗證內容。如果 Cache-Control 為 private,則 CloudFront 應僅將回應儲存在私有快取中,例如瀏覽器的本機快取。
這些行為會覆寫最大 TTL 和預設 TTL 設定。
**注意:**非快取的回應不會包含 Age 標頭。
在上述範例中,最小 TTL 設定為 0。如果最小 TTL 大於 0,則 CloudFront 會快取該物件,即使回應具有 no-cache、no-store 或 private 命令。如需詳細資訊,請參閱指定 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
更新來源
在您確定會覆寫發行項目的自訂物件快取的快取標頭後,請更新來源。
請完成下列步驟:
- 確定 Web 伺服器組態中標頭的位置。
- 移除套用標頭的行。
- 重新啟動伺服器。
- 測試您的來源,確認回應中不再包含快取標頭。
- 在整個 CloudFront 發行項目上執行無效驗證,以套用變更。
相關資訊
- 語言
- 中文 (繁體)

相關內容
- 已提問 2 年前
AWS 官方已更新 9 個月前