生成自定义错误响应 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

生成自定义错误响应

如果您正在提供的对象由于某种原因不可用,则您 CloudFront 的 Web 服务器通常会返回相关的 HTTP 状态代码 CloudFront 来表示这一点。例如,如果查看者请求的网址无效,则您的 Web 服务器会向其返回 HTTP 404(未找到)状态码 CloudFront,并将该状态码 CloudFront 返回给查看者。

如果你愿意 CloudFront ,你可以配置为改为向查看者返回自定义的错误响应。您还可以通过多种选项来管理出现错误时的 CloudFront 响应方式。要为自定义错误消息指定选项,请更新 CloudFront 分布以指定这些值。有关更多信息,请参阅配置错误响应行为

如果您配置 CloudFront 为返回 HTTP 状态代码的自定义错误页面,但自定义错误页面不可用,则会向查看者 CloudFront 返回从包含自定义错误页面的源 CloudFront 收到的状态代码。例如,假设您的自定义源返回 500 状态代码,并且您已配置 CloudFront 为从 Amazon S3 存储桶中获取 500 状态代码的自定义错误页面。但是,有人不小心从您的存储桶中删除了自定义错误页面。 CloudFront 向请求该对象的查看者返回 HTTP 404 状态码(未找到)。

当向查看者 CloudFront 返回自定义错误页面时,您需要为自定义错误页面支付标准 CloudFront 费用,而不是为请求的对象支付费用。有关CloudFront 费用的更多信息,请参阅 Amazon CloudFront 定价

配置错误响应行为

要配置自定义错误响应,您可以使用 CloudFront 控制台、 CloudFront API 或Amazon CloudFormation。无论您选择哪种方式来更新配置,请考虑以下提示和建议:

  • 将您的自定义错误页面保存在可以访问的位置 CloudFront。我们建议您将这些页面存储在 Amazon S3 存储桶中,并且不要将它们与您的网站或应用程序的其余内容存储于同一位置。如果您将自定义错误页面存储在与网站或应用程序相同的来源上,并且源服务器开始返回 5xx 错误,则 CloudFront 无法获取自定义错误页面,因为源服务器不可用。有关更多信息,请参阅将对象和自定义错误页面存储在不同的位置

  • 确保 CloudFront 它有权获取您的自定义错误页面。如果自定义错误页面存储在 Amazon S3 中,则必须可以公开访问这些页面,或者必须配置 CloudFront 源站访问控制 (OAC)。如果自定义错误页面存储在自定义源中,则这些页面必须可公开访问。

  • (可选)如果您需要,还可以配置您的源,以添加 Cache-ControlExpires 标头以及自定义错误页面。您也可以使用错误缓存最小 TTL 设置来控制自定义错误页面的 CloudFront 缓存时间。有关更多信息,请参阅控制 CloudFront 缓存错误的时长

配置自定义错误响应(CloudFront控制台)

要在 CloudFront 控制台中配置自定义错误响应,必须有 CloudFront分发版。在控制台中,自定义错误响应的配置设置仅适用于现有分配。要了解如何创建分配,请参阅 简单 CloudFront 发行版入门

配置自定义错误响应(控制台)
  1. 登录Amazon Web Services Management Console并在 CloudFront 控制台中打开分发页面,网址为https://console.amazonaws.cn/cloudfront/v4/home#distributions

  2. 在分配列表里,选择要更新的分配。

  3. 选择错误页面选项卡,然后选择创建自定义错误响应

  4. 输入适用的值。有关更多信息,请参阅自定义错误页面和错误缓存

  5. 输入所需的值后,选择创建

配置自定义错误响应(CloudFrontAPI 或Amazon CloudFormation)

要使用 CloudFront API 或配置自定义错误响应Amazon CloudFormation,请在分配中使用CustomErrorResponse类型。有关更多信息,请参阅下列内容:

为特定 HTTP 状态代码创建自定义错误页面

如果您希望显示自定义错误消息而不是默认消息(例如,与网站其他部分使用相同格式的页面),则可以让查看者 CloudFront 返回一个包含您的自定义错误消息的对象(例如 HTML 文件)。

要指定要返回的文件以及应返回该文件的错误,请更新您的 CloudFront 分配以指定这些值。有关更多信息,请参阅配置错误响应行为

例如,以下是一个自定义错误页面:


				Amazon 404 页面

您可以为每个支持的 HTTP 状态代码指定一个不同的对象,也可以对所有支持的状态代码使用同一个对象。您可以选择为一些状态代码指定自定义错误页面,而不为另外一些状态代码指定自定义错误页面。

由于各种原因,您正在提供的对象 CloudFront 可能不可用。可将这些原因归为以下两大类:

  • 客户端错误表示请求出现问题。例如,具有指定名称的对象不可用,或用户不具有获取您 Amazon S3 存储桶中的对象所需的权限。当客户端发生错误时,源站会将 4xx 范围内的 HTTP 状态代码返回到CloudFront。

  • 服务器错误表示源服务器出现问题。例如,HTTP 服务器繁忙或不可用。当服务器发生错误时,要么您的源服务器将 5xx 范围内的 HTTP 状态码返回到 CloudFront,要么在一段时间内 CloudFront 未收到源服务器的响应并假定状态码为 504(网关超时)。

CloudFront 可以返回自定义错误页面的 HTTP 状态代码包括以下内容:

  • 400、403、404、405、414、416

    注意

    您可以为 HTTP 状态代码 416 (Requested Range Not Satisfiable) 创建自定义错误页面,并更改在源向 CloudFront 返回状态代码 416 时 CloudFront 向查看器返回的 HTTP 状态代码。(有关更多信息,请参阅 更改返回的响应码 CloudFront。) 但是, CloudFront 不缓存状态码 416 响应,因此即使您为状态码 416 的错误缓存最小 TTL 指定了值,也 CloudFront不会使用该值。

  • 500、501、502、503、504

    注意

    在某些情况下,即使您进行了配置 CloudFront ,也 CloudFront 不会返回 HTTP 503 状态码的自定义错误页面。如果 CloudFront 错误代码为Capacity ExceededLimit Exceeded,则在不使用自定义错误页面的情况下向查看者 CloudFront 返回 503 状态码。

有关如何 CloudFront 处理来自您的来源的错误响应的详细说明,请参阅如何 CloudFront 处理和缓存来自您的源的 HTTP 4xx 和 5xx 状态代码

将对象和自定义错误页面存储在不同的位置

如果您希望将您的对象和自定义错误页面存储在不同的位置,您的分配必须包含满足以下条件时的缓存行为:

  • Path Pattern 的值与您的自定义错误消息的路径匹配。例如,假设您在 Amazon S3 桶中名为 /4xx-errors 的目录下为 4xx 错误保存了自定义错误页面。您的分配必须包含缓存行为,其路径模式将对自定义错误页面的请求路由至该位置,例如 /4xx-errors/*

  • 值指定包含您的自定义错误页面的源的源 ID 值。

有关更多信息,请参阅缓存行为设置

更改返回的响应码 CloudFront

您可以配置 CloudFront 为向查看者返回不同于从源站 CloudFront收到的 HTTP 状态码。例如,如果您的源向返回 500 状态码 CloudFront,则您可能需要 CloudFront 向查看者返回一个自定义错误页面和 200 状态代码(OK)。出于多种原因,您可能希望 CloudFront 向查看者返回的状态码不同于您的来源返回的状态码 CloudFront:

  • 一些互联网设备(例如,一些防火墙和企业代理)会拦截 HTTP 4xx 和 5xx 状态代码,防止响应返回到查看器。在这种情况下,如果您替换 200,就不会截获响应。

  • 如果您不关心区分不同的客户端错误或服务器错误,则可以将400500指定为所有 4xx 或 5xx 状态代码的 CloudFront返回值。

  • 您可能希望返回 200 状态代码 (OK) 和静态网站,确保客户不知道网站宕机。

如果您启用CloudFront 标准日志并配置 CloudFront为更改响应中的 HTTP 状态码,则日志中该sc-status列的值将包含您指定的状态码。但是,x-edge-result-type 列的值不受影响。该值包含源响应的结果类型。例如,假设您配置 CloudFront 为在源返回404(未找到)时向查看者返回状态码 CloudFront。200当源使用 404 状态代码响应请求时,日志中 sc-status 列的值将为 200,但 x-edge-result-type 列的值将为 Error

您可以配置 CloudFront 为返回以下任何 HTTP 状态代码以及自定义错误页面:

  • 200

  • 400、403、404、405、414、416

  • 500、501、502、503、504

控制 CloudFront 缓存错误的时长

CloudFront 缓存错误响应的默认持续时间为 10 秒。 CloudFront 然后将该对象的下一个请求提交给您的来源,以查看导致错误的问题是否已解决以及所请求的对象是否可用。

您可以为缓存的每个 4xx 和 5xx 状态代码指定错误缓存持续时间(错误缓存最小 TTL)。 CloudFront (有关更多信息,请参阅 缓存的 HTTP 4xx 和 5xx 状态码 CloudFront。) 指定持续时间时,注意以下几点:

  • 如果您指定较短的错误缓存持续时间,则向源 CloudFront 服务器转发的请求将多于您指定的持续时间更长的请求。对于 5xx 错误,这可能会加重原先导致源返回错误的问题。

  • 当您的来源返回对象的错误时, CloudFront 会使用错误响应或自定义错误页面来响应对该对象的请求,直到错误缓存持续时间过去。如果您指定较长的错误缓存持续时间,则 CloudFront 可能会在对象再次可用后很长一段时间内继续使用错误响应或自定义错误页面来响应请求。

注意

您可以为 HTTP 状态代码 416 (Requested Range Not Satisfiable) 创建自定义错误页面,并更改在源向 CloudFront 返回状态代码 416 时 CloudFront 向查看器返回的 HTTP 状态代码。(有关更多信息,请参阅 更改返回的响应码 CloudFront。) 但是, CloudFront 不缓存状态码 416 响应,因此即使您为状态码 416 的错误缓存最小 TTL 指定了值,也 CloudFront不会使用该值。

如果要控制单个对象的错误 CloudFront 缓存时间,可以将源服务器配置为将适用的标头添加到该对象的错误响应中。

如果源添加了Cache-Control: max-ageCache-Control: s-maxage指令或标头,则会 CloudFront 缓存Expires标头中值或错误缓存最小 TTL 中较大值的错误响应。

注意

Cache-Control: max-ageCache-Control: s-maxage 值不能大于为提取错误页面的缓存行为设置的 Maximum TTL(最大 TTL)值。

如果源添加了其他Cache-Control指令或未添加任何标头,则将错误响应CloudFront 缓存为错误缓存最小 TTL 值。

如果某一对象的 4xx 或 5xx 状态代码的过期时间超过您希望等待的时间且对象再次可访问,您可以使用所请求对象的 URL 使缓存错误代码失效。如果源返回针对多个对象的错误响应,您需要分别使各个对象失效。有关使对象失效的更多信息,请参阅 使文件失效