如何 CloudFront 处理和缓存来自您的源的 HTTP 4xx 和 5xx 状态代码 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

如何 CloudFront 处理和缓存来自您的源的 HTTP 4xx 和 5xx 状态代码

从您的 Amazon S3 存储桶或自定义源服务器 CloudFront 请求对象时,您的源有时会返回 HTTP 4xx 或 5xx 状态代码,表示发生了错误。 CloudFront 行为取决于:

  • 您是否已配置自定义错误页面。

  • 是否已配置 CloudFront 要缓存来自来源的错误响应的时长(错误缓存最小 TTL)。

  • 状态代码。

  • 对于 5xx 状态码,表示请求的对象当前是否在 CloudFront 边缘缓存中。

  • 对于部分 4xx 状态代码,源返回 Cache-Control max-age 还是 Cache-Control s-maxage 标头。

CloudFront 总是缓存对GETHEAD请求的响应。您也可以配置为缓存 CloudFront 对OPTIONS请求的响应。 CloudFront 不缓存对使用其他方法的请求的响应。

如果源没有响应,则对源站的 CloudFront 请求会超时,这被视为来自源的 HTTP 5xx 错误,尽管源没有响应该错误。在这种情况下, CloudFront 将继续提供缓存的内容。有关更多信息,请参阅源不可用

如果您启用了日志记录,则不管 HTTP 状态代码如何,都会将结果 CloudFront 写入日志。

有关与返回的错误消息相关的功能和选项的更多信息 CloudFront,请参阅以下内容:

配置自定义错误页面后如何 CloudFront 处理错误

如果您配置了自定义错误页面,则 CloudFront 行为取决于所请求的对象是否在边缘缓存中。

请求的对象未在边缘缓存中

CloudFront 当以下所有条件均为真时,继续尝试从您的来源获取请求的对象:

  • 查看器请求对象。

  • 对象不在边缘缓存中。

  • 您的源返回 HTTP 4xx 或 5xx 状态代码并且出现下列情况之一:

CloudFront 执行以下操作:

  1. 在收到查看者请求的 CloudFront 边缘缓存中, CloudFront 检查您的分发配置,并获取与您的源返回的状态代码相对应的自定义错误页面的路径。

  2. CloudFront 查找分配中第一个路径模式与自定义错误页面路径匹配的缓存行为。

  3. 边 CloudFront 缘位置向缓存行为中指定的源站发送自定义错误页面的请求。

  4. 源将自定义错误页面返回到边缘站点。

  5. CloudFront 将自定义错误页面返回给发出请求的查看者,还会缓存自定义错误页面以获取以下最大值:

    • 错误缓存最小 TTL 指定的时间量(默认情况下为 10 秒)

    • 在第一个请求生成错误时,源返回的 Cache-Control max-age 标头或 Cache-Control s-maxage 标头指定的时间量

  6. 缓存时间(在步骤 5 中确定)过后,再次 CloudFront 尝试通过将另一个请求转发到您的源来获取请求的对象。 CloudFront 继续按错误缓存最小 TTL 指定的间隔重试。

请求的对象在边缘缓存中

CloudFront 当满足以下所有条件时,将继续为当前位于边缘缓存中的对象提供服务:

  • 查看器请求对象。

  • 对象在边缘缓存中但已过期。

  • 源返回 HTTP 5xx 状态代码,而不是返回 304 状态代码(未修改)或更新版本的对象。

CloudFront 执行以下操作:

  1. 如果您的源返回 5xx 状态码,则即使对象已过期,也将为其 CloudFront 提供服务。在错误缓存最小 TTL 持续时间内, CloudFront 继续通过从边缘缓存提供对象来响应查看者的请求。

    如果源返回一个 4xx 状态代码,则 CloudFront 将该状态代码而不是请求的对象返回到查看器。

  2. 在错误缓存最小 TTL 已过后,再次 CloudFront 尝试通过将另一个请求转发到您的源来获取请求的对象。请注意,如果不经常请求该对象,则 CloudFront 可能会在源服务器仍在返回 5xx 响应时将其从边缘缓存中移出。有关对象在 CloudFront 边缘缓存中停留多长时间的信息,请参见管理内容保留在缓存中的时间长度(过期)

未配置自定义错误页面时如何 CloudFront 处理错误

如果您尚未配置自定义错误页面,则 CloudFront 行为取决于所请求的对象是否在边缘缓存中。

请求的对象未在边缘缓存中

CloudFront 当以下所有条件均为真时,继续尝试从您的来源获取请求的对象:

  • 查看器请求对象。

  • 对象不在边缘缓存中。

  • 您的源返回 HTTP 4xx 或 5xx 状态代码并且出现下列情况之一:

CloudFront 执行以下操作:

  1. CloudFront 向查看者返回 4xx 或 5xx 状态码,并将状态码缓存在接收到请求的边缘缓存中,最大值为以下内容:

    • 错误缓存最小 TTL 指定的时间量(默认情况下为 10 秒)

    • 在第一个请求生成错误时,源返回的 Cache-Control max-age 标头或 Cache-Control s-maxage 标头指定的时间量

  2. 在缓存时间内(在步骤 1 中确定),使用缓存的 4xx 或 5xx 状态代码 CloudFront 响应后续查看者对同一对象的请求。

  3. 缓存时间(在步骤 1 中确定)过后,再次 CloudFront 尝试通过将另一个请求转发到您的源来获取请求的对象。 CloudFront 继续按错误缓存最小 TTL 指定的间隔重试。

请求的对象在边缘缓存中

CloudFront 当满足以下所有条件时,将继续为当前位于边缘缓存中的对象提供服务:

  • 查看器请求对象。

  • 对象在边缘缓存中但已过期。

  • 源返回 HTTP 5xx 状态代码,而不是返回 304 状态代码(未修改)或更新版本的对象。

CloudFront 执行以下操作:

  1. 如果您的 Origin 返回 5xx 错误代码,则即使对象已过期,也会为其 CloudFront 提供服务。在错误缓存最小 TTL 期间(默认为 10 秒), CloudFront 继续通过从边缘缓存中提供对象来响应查看者的请求。

    如果源返回一个 4xx 状态代码,则 CloudFront 将该状态代码而不是请求的对象返回到查看器。

  2. 在错误缓存最小 TTL 已过后,再次 CloudFront 尝试通过将另一个请求转发到您的源来获取请求的对象。请注意,如果不经常请求该对象,则 CloudFront 可能会在源服务器仍在返回 5xx 响应时将其从边缘缓存中移出。有关对象在 CloudFront 边缘缓存中停留多长时间的信息,请参见管理内容保留在缓存中的时间长度(过期)

缓存的 HTTP 4xx 和 5xx 状态码 CloudFront

CloudFront 缓存您的源返回的 HTTP 4xx 和 5xx 状态码,具体取决于返回的特定状态码以及您的源是否在响应中返回特定的标头。

始终缓存的 HTTP 4xx 和 5xx 状态码 CloudFront

CloudFront 始终缓存您的源返回的以下 HTTP 4xx 和 5xx 状态码。如果您已为 HTTP 状态代码配置了自定义错误页面,则会 CloudFront 缓存自定义错误页面。

404

Not Found

414

Request-URI Too Large

500

Internal Server Error

501

Not Implemented

502

Bad Gateway

503

Service Unavailable

504

网关超时

基于标 CloudFront头缓存的 HTTP 4xx 状态码 Cache-Control

CloudFront 仅当您的源返回Cache-Control max-ageCache-Control s-maxage标头时,才会缓存源返回的以下 HTTP 4xx 状态码。如果您为其中一个 HTTP 状态代码配置了自定义错误页面,并且您的源返回了其中一个缓存控制标头,则会缓存自定义错误页面。CloudFront

400

Bad Request

403

禁止

405

Method Not Allowed

412

前置条件失败

415

媒体类型不受支持