所有边缘函数的限制 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

所有边缘函数的限制

以下限制适用于所有边缘函数,包括 CloudFront Functions 和 Lambda@Edge。

Amazon Web Services 账户所有权

要将边缘函数与 CloudFront 分配相关联,该函数和分配必须属于相同的 Amazon Web Services 账户。

组合 CloudFront Functions 与 Lambda@Edge

对于给定缓存行为,将适用以下限制将适用:

  • 每个事件类型(查看器请求、源请求、源响应和查看器响应)只能有一个边缘函数关联。

  • 您不能在查看器事件(查看器请求和查看器响应)中组合 CloudFront Functions 和 Lambda@Edge。

允许使用边缘函数的所有其他组合。下表介绍了允许的组合。

CloudFront Functions

查看器请求

查看器响应

Lambda@Edge

查看器请求

不允许

不允许

源请求

已允许

已允许

源响应

已允许

已允许

查看器响应

不允许

不允许

HTTP 状态代码

如果源返回 400 或更高的 HTTP 状态代码,则 CloudFront 不会对查看器响应事件调用边缘函数。

用于源响应事件的 Lambda@Edge 函数被调用于全部源响应,包括源返回 400 或更高的 HTTP 状态代码。有关更多信息,请参阅更新源响应触发器中的 HTTP 响应

HTTP 标头

不允许使用某些 HTTP 标头,这意味着这些标头不会向边缘函数公开,并且函数无法添加它们。其他标头是只读的,这意味着函数可以读取它们,但不能添加或修改它们。

不允许使用的标头

以下 HTTP 标头不会向边缘函数公开,并且函数无法添加它们。如果您的函数添加这些标头的其中之一,则请求将无法通过 CloudFront 验证,并且 CloudFront 会将 HTTP 状态代码 502(无效网关)返回给查看器。

  • Connection

  • Expect

  • Keep-Alive

  • Proxy-Authenticate

  • Proxy-Authorization

  • Proxy-Connection

  • Trailer

  • Upgrade

  • X-Accel-Buffering

  • X-Accel-Charset

  • X-Accel-Limit-Rate

  • X-Accel-Redirect

  • X-Amz-Cf-*

  • X-Amzn-Auth

  • X-Amzn-Cf-Billing

  • X-Amzn-Cf-Id

  • X-Amzn-Cf-Xff

  • X-Amzn-Errortype

  • X-Amzn-Fle-Profile

  • X-Amzn-Header-Count

  • X-Amzn-Header-Order

  • X-Amzn-Lambda-Integration-Tag

  • X-Amzn-RequestId

  • X-Cache

  • X-Edge-*

  • X-Forwarded-Proto

  • X-Real-IP

只读标头

以下标头是只读的。您的函数可以读取这些标头,并将其用作函数逻辑输入,但无法更改这些值。如果您的函数添加或编辑一个只读标头,请求将无法通过 CloudFront 验证,并且 CloudFront 将 HTTP 状态代码 502(无效网关)返回到查看器。

查看器请求事件中的只读标头

以下标头在查看器请求事件中为只读标头。

  • Content-Length

  • Host

  • Transfer-Encoding

  • Via

源请求事件中的只读标头(仅限 Lambda@Edge)

以下标头在源请求事件中是只读的,它们仅存在于 Lambda@Edge 中。

  • Accept-Encoding

  • Content-Length

  • If-Modified-Since

  • If-None-Match

  • If-Range

  • If-Unmodified-Since

  • Transfer-Encoding

  • Via

源响应事件中的只读标头(仅限 Lambda@Edge)

以下标头在源响应事件中是只读的,它们仅存在于 Lambda@Edge 中。

  • Transfer-Encoding

  • Via

查看器响应事件中的只读标头

以下标头在查看器响应事件中为只读标头(对于 CloudFront Functions 和 Lambda@Edge)

  • Warning

  • Via

以下标头在查看器响应事件中为只读标头(对于 Lambda@Edge)。

  • Content-Length

  • Content-Encoding

  • Transfer-Encoding

查询字符串

以下限制适用于在请求 URI 中读取、更新或创建查询字符串的函数。

  • (仅限 Lambda@Edge)要访问源请求或源响应函数中的查询字符串,您的缓存策略或源请求策略必须针对查询字符串设置为 All

  • 函数可以为查看器请求和源请求事件创建或更新查询字符串(源请求事件仅在 Lambda@Edge 中存在)。

  • 函数可以为源响应和查看器响应事件读取查询字符串,但不能创建或更新查询字符串(源响应事件仅在 Lambda@Edge 中存在)。

  • 如果函数创建或更新查询字符串,则具有以下限制:

    • 查询字符串不能包含空格、控制字符或片段标识符 (#)。

    • URI(包括查询字符串)的总大小必须小于 8192 个字符。

    • 建议您对 URI 和查询字符串使用百分号编码。有关更多信息,请参阅URI 和查询字符串编码

URI

如果某个函数更改请求的 URI,则这样不会更改该请求或该请求转发到的源的缓存行为。

URI(包括查询字符串)的总大小必须小于 8192 个字符。

URI 和查询字符串编码

传递给边缘函数的 URI 和查询字符串值是 UTF-8 编码。您的函数应该对其返回的 URI 和查询字符串值使用 UTF-8 编码。百分号编码与 UTF-8 编码兼容。

下面的列表说明了 CloudFront 如何处理 URI 和查询字符串值编码:

  • 如果请求中的值是 UTF-8 编码,则 CloudFront 会将值转发给您的函数,而不会更改它们。

  • 如果请求中的值为 ISO-8859-1 编码,CloudFront 会将值转换为 UTF-8 编码,然后再将值转发给您的函数。

  • 如果请求中的值使用任何其他字符编码方式进行编码,则 CloudFront 会假定它们是 ISO-8859-1 编码,并尝试从 ISO-8859-1 编码转换为 UTF-8 编码。

    重要

    转换后字符可能是原始请求中的值的不准确解释。这可能会导致您的函数或源生成意外结果。

CloudFront 转发到源的 URI 和查询字符串值取决于函数是否更改了值:

  • 如果函数没有更改 URI 或查询字符串,CloudFront 将其在请求中收到的值转发到源。

  • 如果函数更改了 URI 或查询字符串,CloudFront 转发 UTF-8 编码的值。

Microsoft Smooth Streaming

您无法将用于流式传输媒体文件(已转码为 Microsoft Smooth Streaming 格式)的 CloudFront 分配与边缘函数一同使用。

标记

您无法将标签添加到边缘函数中。要了解有关在 CloudFront 中进行标记的更多信息,请参阅标记 Amazon CloudFront 分配