所有边缘函数的限制
以下限制适用于所有边缘函数,包括 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 中进行标记的更多信息,请参阅标记分配。