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

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

当 CloudFront 从 Amazon S3 存储桶或自定义源服务器中请求对象时,源有时会返回 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 会通过再向您的源转发一个请求来再次尝试获取请求的对象。请注意,如果未频繁请求该对象,当您的源服务器仍返回 5xx 响应时,CloudFront 可能会将该对象从边缘缓存中逐出。有关对象在 CloudFront 边缘缓存中的保留时长的信息,请参阅管理内容保留在缓存中的时间长度(过期)

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

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

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

在满足以下所有条件时,CloudFront 将继续尝试从您的源获取请求的对象:

  • 查看器请求对象。

  • 对象不在边缘缓存中。

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

CloudFront 将执行以下操作:

  1. CloudFront 将 4xx 或 5xx 状态代码返回给查看器,同时将状态代码在接收请求的边缘缓存中缓以下时间中的最大值:

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

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

  2. 对于缓存持续时间(在第 1 步中确定),CloudFront 会以缓存的 4xx 或 5xx 状态代码来响应针对同一对象的后续查看方请求。

  3. 经过了缓存时间(在第 1 步中确定)之后,CloudFront 向源转发另一个请求以再次尝试获取请求的对象。CloudFront 将继续按照由最短错误缓存 TTL 指定的间隔重试。

请求的对象在边缘缓存中

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

  • 查看器请求对象。

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

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

CloudFront 将执行以下操作:

  1. 如果您的源返回 5xx 错误代码,则 CloudFront 将提供对象,即使它已过期。在错误缓存最小 TTL 的持续时间(默认情况下为 10 秒)内,CloudFront 会通过从边缘缓存提供对象来继续响应查看器请求。

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

  2. 在最短错误缓存 TTL 过后,CloudFront 会通过再向您的源转发一个请求来再次尝试获取请求的对象。请注意,如果未频繁请求该对象,当您的源服务器仍返回 5xx 响应时,CloudFront 可能会将该对象从边缘缓存中逐出。有关对象在 CloudFront 边缘缓存中的保留时长的信息,请参阅管理内容保留在缓存中的时间长度(过期)

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

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

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

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 根据 Cache-Control 标头缓存的 HTTP 4xx 的状态代码

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

400

Bad Request

403

禁止

405

Method Not Allowed

412¹

前置条件失败

415¹

媒体类型不受支持

¹CloudFront 不支持为这些 HTTP 状态代码创建自定义错误页面。