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 缓存响应也是如此。所有私有缓存(例如浏览器或代理)都可以使用来源的缓存标头。
如果您的分配未根据您的默认 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 缓存。如果 Expires 日期仍在将来,则缓存的响应也不会过时。即使缓存行为路径将最小 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 指令。有关详细信息,请参阅 Specify the amount of time that CloudFront caches objects(指定 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 分配进行失效处理以应用更改。
相关信息
- 语言
- 中文 (简体)
