

# 所有边缘函数的限制
<a name="edge-function-restrictions-all"></a>

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

**Topics**
+ [AWS 账户所有权](#function-restrictions-account-ownership)
+ [组合 CloudFront Functions 与 Lambda@Edge](#function-restrictions-combining-functions)
+ [HTTP 状态代码](#function-restrictions-status-codes)
+ [HTTP 标头](#function-restrictions-headers)
+ [查询字符串](#function-restrictions-query-strings)
+ [URI](#function-restrictions-uri)
+ [URI、查询字符串和标头编码](#function-restrictions-encoding)
+ [Microsoft Smooth Streaming](#function-restrictions-microsoft-smooth-streaming)
+ [标签](#function-restrictions-tagging)

## AWS 账户所有权
<a name="function-restrictions-account-ownership"></a>

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

## 组合 CloudFront Functions 与 Lambda@Edge
<a name="function-restrictions-combining-functions"></a>

对于给定缓存行为，将适用以下限制将适用：
+ 每个事件类型（查看器请求、源请求、源响应和查看器响应）只能有一个边缘函数关联。
+ 您不能在查看器事件（查看器请求和查看器响应）中组合 CloudFront Functions 和 Lambda@Edge。

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/edge-function-restrictions-all.html)

## HTTP 状态代码
<a name="function-restrictions-status-codes"></a>

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

用于源响应事件的 Lambda@Edge 函数被调用于*全部*源响应，包括源返回 400 或更高的 HTTP 状态代码。有关更多信息，请参阅 [更新源响应触发器中的 HTTP 响应](lambda-generating-http-responses.md#lambda-updating-http-responses)。

## HTTP 标头
<a name="function-restrictions-headers"></a>

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

**Topics**
+ [不允许使用的标头](#function-restrictions-disallowed-headers)
+ [只读标头](#function-restrictions-read-only-headers)

### 不允许使用的标头
<a name="function-restrictions-disallowed-headers"></a>

以下 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`

### 只读标头
<a name="function-restrictions-read-only-headers"></a>

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

#### 查看器请求事件中的只读标头
<a name="function-restrictions-read-only-headers-viewer-request"></a>

以下标头在查看器请求事件中为只读标头。
+ `Content-Length`
+ `Host`
+ `Transfer-Encoding`
+ `Via`

#### 源请求事件中的只读标头（仅限 Lambda@Edge）
<a name="function-restrictions-read-only-headers-origin-request"></a>

以下标头在源请求事件中是只读的，它们仅存在于 Lambda@Edge 中。
+ `Accept-Encoding`
+ `Content-Length`
+ `If-Modified-Since`
+ `If-None-Match`
+ `If-Range`
+ `If-Unmodified-Since`
+ `Transfer-Encoding`
+ `Via`

#### 源响应事件中的只读标头（仅限 Lambda@Edge）
<a name="function-restrictions-read-only-headers-origin-response"></a>

以下标头在源响应事件中是只读的，它们仅存在于 Lambda@Edge 中。
+ `Transfer-Encoding`
+ `Via`

#### 查看器响应事件中的只读标头
<a name="function-restrictions-read-only-headers-viewer-response"></a>

以下标头在查看器响应事件中为只读标头（对于 CloudFront Functions 和 Lambda@Edge）
+ `Warning`
+ `Via`

以下标头在查看器响应事件中为只读标头（对于 Lambda@Edge）。
+ `Content-Length`
+ `Content-Encoding`
+ `Transfer-Encoding`

## 查询字符串
<a name="function-restrictions-query-strings"></a>

以下限制适用于在请求 URI 中读取、更新或创建查询字符串的函数。
+ （仅限 Lambda@Edge）要访问源请求或源响应函数中的查询字符串，您的缓存策略或源请求策略必须针对**查询字符串**设置为 **All**。
+ 函数可以为查看器请求和源请求事件创建或更新查询字符串（源请求事件仅在 Lambda@Edge 中存在）。
+ 函数可以为源响应和查看器响应事件读取查询字符串，但不能创建或更新查询字符串（源响应事件仅在 Lambda@Edge 中存在）。
+ 如果函数创建或更新查询字符串，则具有以下限制：
  + 查询字符串不能包含空格、控制字符或片段标识符 (`#`)。
  + URI（包括查询字符串）的总大小必须小于 8192 个字符。
  + 建议您对 URI 和查询字符串使用百分号编码。有关更多信息，请参阅 [URI、查询字符串和标头编码](#function-restrictions-encoding)。

## URI
<a name="function-restrictions-uri"></a>

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

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

## URI、查询字符串和标头编码
<a name="function-restrictions-encoding"></a>

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

下面的列表解释了 CloudFront 如何处理 URI、查询字符串和标头的编码：
+ 如果请求中的值是 UTF-8 编码，则 CloudFront 会将值转发给您的函数，而不会更改它们。
+ 如果请求中的值为 [ISO-8859-1 编码](https://en.wikipedia.org/wiki/ISO/IEC_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
<a name="function-restrictions-microsoft-smooth-streaming"></a>

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

## 标签
<a name="function-restrictions-tagging"></a>

您无法将标签添加到边缘函数。有关在 CloudFront 中进行标记的更多信息，请参阅[标记分配](tagging.md)。