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

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

在请求触发器中生成 HTTP 响应

CloudFront 收到请求时,您可以使用 Lambda 函数生成 HTTP 响应,该响应直接 CloudFront 返回给查看者,而无需将响应转发到源。生成 HTTP 响应会减少源上的负载,通常也可以减少查看器的延迟。

生成 HTTP 响应的一些常见情况包括:

  • 将小网页返回到查看器

  • 返回 HTTP 301 或 302 状态代码,以便将用户重定向到其他网页

  • 用户未通过身份验证时向查看器返回 HTTP 401 状态代码

当 CloudFront 发生以下事件时,Lambda @Edge 函数可以生成 HTTP 响应:

查看器请求事件

当一个函数由查看者请求事件触发时,会将响应 CloudFront 返回给查看者,并且不会对其进行缓存。

源请求事件

当一个函数由源请求事件触发时, CloudFront 会检查边缘缓存中是否有该函数先前生成的响应。

  • 如果响应在缓存中,则不会执行该函数,而是将缓存的响应 CloudFront 返回给查看者。

  • 如果响应不在缓存中,则执行该函数,将响应 CloudFront 返回给查看者,并对其进行缓存。

要查看生成 HTTP 响应的一些代码示例,请参阅 Lambda@Edge 函数示例。您也可以替换响应触发器中的 HTTP 响应。有关更多信息,请参阅更新源响应触发器中的 HTTP 响应

编程模型

本节介绍了使用 Lambda@Edge 生成 HTTP 响应的编程模型的信息。

响应对象

作为 result 方法的 callback 参数返回的响应应具有以下结构 (请注意,只有 status 字段为必填字段)。

const response = { body: 'content', bodyEncoding: 'text' | 'base64', headers: { 'header name in lowercase': [{ key: 'header name in standard case', value: 'header value' }], ... }, status: 'HTTP status code (string)', statusDescription: 'status description' };

响应对象可包括以下值:

body

要在生成的响应中 CloudFront 返回的正文(如果有)。

bodyEncoding

您在 body 中指定的值的编码。有效编码仅为 textbase64。如果在response对象body中包含但省略bodyEncoding,则会将正文 CloudFront 视为文本。

如果指定bodyEncoding为,base64但正文无效 base64, CloudFront 则返回错误。

headers

您 CloudFront 要在生成的响应中返回的标头。请注意以下几点:

  • headers 对象中的键为标准 HTTP 请求标头名称的小写版本。使用小写键可为您提供对标头值的不区分大小写的访问权限。

  • 每个标头 (例如,headers["accept"]headers["host"]) 是一个键值对数组。对于一个指定标头,数组为生成的响应中的每个值包含一个键值对。

  • key(可选)是显示在 HTTP 请求中的标头名称,区分大小写;例如 accepthost

  • 指定 value 作为标头值。

  • 如果您不包括键值对的标头键部分,Lambda@Edge 会使用您提供的标头名称自动插入标头键。无论您如何格式化标头名称,所插入的标头键都会自动通过对每个部分使用首字母大写方式(用连字符 (-) 分隔)来格式化。

    例如,您可以不带标头键添加标头,如下所示:'content-type': [{ value: 'text/html;charset=UTF-8' }]

    在本示例中,Lambda@Edge 创建以下标头键:Content-Type

有关标头使用情况限制的信息,请参阅边缘函数的限制

status

HTTP 状态代码。以字符串形式提供状态码。 CloudFront 使用提供的状态码执行以下操作:

如果该status值不在 200 和 599 之间, CloudFront 则向查看者返回错误。

statusDescription

您 CloudFront 要在响应中返回的描述,与 HTTP 状态代码一起返回。无需使用标准说明,例如为 HTTP 状态代码 200 使用 OK

错误

以下是所生成的 HTTP 响应可能的错误。

响应包含正文并为状态指定了 204(无内容)

当一个函数由查看者请求触发时,当以下两个条件均为真时,会向查看器 CloudFront 返回 HTTP 502 状态码(错误的网关):

  • status 的值为 204(无内容)

  • 响应包括 body 的值

这是因为 Lambda@Edge 会施加 RFC 2616 中介绍的可选限制,其中指出 HTTP 204 响应不需要包含消息正文。

对所生成响应的大小的限制

由 Lambda 函数生成的响应的最大大小取决于触发该函数的事件:

  • 查看器请求事件 – 40 KB

  • 源请求事件 – 1 MB

如果响应大于允许的大小,则向查看者 CloudFront 返回 HTTP 502 状态代码(错误的网关)。

必填字段

status 字段为必填项。

其他所有字段均为可选字段。