

# 使用策略来控制源请求
<a name="controlling-origin-requests"></a>

当发送到 CloudFront 的查看器请求导致*缓存未命中*（请求的对象未在边缘站点缓存）时，CloudFront 会向源发送请求以检索对象。这称为*源请求*。源请求始终包含来自查看器请求的以下信息：
+ URL 路径（仅路径，不包含 URL 查询字符串或域名）
+ 请求正文（如果有）
+ CloudFront 在每个源请求中自动包含的 HTTP 标头，包括 `Host`、`User-Agent` 和 `X-Amz-Cf-Id`。

默认情况下，查看器请求中的其他信息（如 URL 查询字符串、HTTP 标头和 Cookie）不包含在源请求中。（例外：使用旧缓存设置时，CloudFront 默认将标头转发到您的源。） 然而，您可能希望在源处接收其它一些此类信息，例如收集数据以进行分析或遥测。您可以使用*源请求策略* 控制源请求中包含的信息。

源请求策略与控制缓存键的[缓存策略](controlling-the-cache-key.md)是分开的。通过这种方法，您可以在源端接收其他信息，并保持良好的*缓存命中率*（查看器请求导致缓存命中的比率）。您可以通过单独控制哪些信息包含在源请求中（使用源请求策略）以及哪些信息包含在缓存键中（使用缓存策略）来做到这一点。

虽然这两种策略是分开的，但它们却相关联。您在缓存键中包含的所有 URL 查询字符串、HTTP 标头和 Cookie（使用缓存策略）都将自动包含在源请求中。使用源请求策略指定要包含在源请求中但*不* 包含在缓存键中的信息。与缓存策略一样，您可以将源请求策略附加到 CloudFront 分配中的一个或多个缓存行为。

还可以使用源请求策略将其他 HTTP 标头添加到查看器请求中未包含的源请求。这些附加标头是 CloudFront 在发送源请求之前添加的，而标头值是根据查看器请求自动确定的。有关更多信息，请参阅 [添加 CloudFront 请求标头](adding-cloudfront-headers.md)。

**Topics**
+ [了解源请求策略](origin-request-understand-origin-request-policy.md)
+ [创建源请求策略](origin-request-create-origin-request-policy.md)
+ [使用托管式源请求策略](using-managed-origin-request-policies.md)
+ [添加 CloudFront 请求标头](adding-cloudfront-headers.md)
+ [了解源请求策略和缓存策略如何协同工作](understanding-how-origin-request-policies-and-cache-policies-work-together.md)

# 了解源请求策略
<a name="origin-request-understand-origin-request-policy"></a>

CloudFront 为常见使用案例提供了一些预定义的源请求策略（称为*托管策略*）。您可以使用这些托管策略，也可以创建特定于您的需求的源请求策略。有关托管策略的更多信息，请参阅[使用托管式源请求策略](using-managed-origin-request-policies.md)。

源请求策略包含以下设置，这些设置的分类如下：*策略信息* 和*源请求设置*。

## 策略信息
<a name="origin-request-understand-origin-request-policy-info"></a>

**名称**  
用于标识源请求策略的名称。在控制台中，可以使用名称将源请求策略附加到缓存行为。

**描述**  
描述源请求策略的注释。该项为可选项。

## 源请求设置
<a name="origin-request-understand-origin-request-policy-settings"></a>

源请求设置指定查看器请求中包含的值，这些值包含在 CloudFront 发送到源的请求（称为源请求）中。这些值可以包括 URL 查询字符串、HTTP 标头和 Cookie。您指定的值包含在源请求中，但不会包含在缓存键中。有关控制缓存键的信息，请参阅[使用策略来控制缓存键](controlling-the-cache-key.md)。

**标头**  
CloudFront 包含在源请求中的查看器请求中的 HTTP 标头。对于标头，您可以选择下列设置之一：  
+ **无** – 查看器请求中的 HTTP 标头*不* 会包含在源请求中。
+ **所有查看器标头** – 查看器请求中的所有 HTTP 标头都包含在源请求中。
+ **所有查看器标头以及下列 CloudFront 标头** – 查看器请求中的所有 HTTP 标头都包含在源请求中。此外，您可以指定要添加到源请求中的 CloudFront 标头。有关 CloudFront 标头的更多信息，请参阅[添加 CloudFront 请求标头](adding-cloudfront-headers.md)。
+ **Include the following headers**（包含以下标头）– 您可以指定哪些 HTTP 标头包含在源请求中。
**注意**  
请勿指定已包含在**源自定义标头**设置中的标头。有关更多信息，请参阅 [配置 CloudFront 以便向源请求添加自定义标头](add-origin-custom-headers.md#add-origin-custom-headers-configure)。
+ **除以下范围之外的所有查看器标头**–您指定哪些 HTTP 标头***不***包含在源请求中。除了指定的标头外，查看器请求中的所有其他 HTTP 标头都包括在内。
当您使用**所有查看器标头以及下列 CloudFront 标头**、**包括以下标头**或**除以下范围之外的所有查看器标头**设置时，可以仅按 HTTP 标头的名称指定它们。CloudFront 会将完整标头（包括其值）包含在源请求中。  
当您使用**除以下范围之外的所有查看器标头**设置来删除查看器的 `Host` 标头时，CloudFront 会在源请求中添加一个包含源域名的新 `Host` 标头。

**Cookies**  
CloudFront 包含在源请求中的查看器请求中的 Cookie。对于 Cookie，您可以选择下列设置之一：  
+ **无** – 查看器请求中的 Cookie *不* 会包含在源请求中。
+ **全部** – 查看器请求中的所有 Cookie 都包含在源请求中。
+ **包括以下 Cookie** – 您可以指定查看器请求中的哪些 Cookie 包含在源请求中。
+ **除以下范围之外的所有 Cookie** – 您可以指定查看器请求中的哪些 Cookie ***不***包含在源请求中。查看器请求中的所有其他 Cookie 都包含在内。
在使用**包括以下 Cookie** 或 **除以下范围之外的所有 Cookie** 设置时，可以仅按 Cookie 的名称指定它们。CloudFront 会将完整 Cookie（包括其值）包含在源请求中。

**查询字符串**  
CloudFront 包含在源请求中的查看器请求中的 URL 查询字符串。对于查询字符串，可以选择下列设置之一：  
+ **无** – 查看器请求中的查询字符串*不* 会包含在源请求中。
+ **全部** – 查看器请求中的所有查询字符串都包含在源请求中。
+ **包含指定以下字符串** – 您可以指定查看器请求中的哪些查询字符串包含在源请求中。
+ **除以下范围之外的所有查询字符串** – 您可以指定查看器请求中的哪些查询字符串***不***包含在源请求中。所有其他查询字符串都包括在内。
在使用**包括以下查询字符串**或**除以下范围之外的所有查询字符串**设置时，您可以仅按查询字符串的名称指定它们。CloudFront 会将完整的查询字符串（包括其值），包含在源请求中。

# 创建源请求策略
<a name="origin-request-create-origin-request-policy"></a>

您可以使用源请求策略控制包含在 CloudFront 发送到源的请求中的值（URL 查询字符串、HTTP 标头和 Cookie）。您可以使用 AWS Command Line Interface（AWS CLI）或 CloudFront API 在 CloudFront 控制台中创建源请求策略。

创建源请求策略后，可以将它附加到 CloudFront 分配中的一个或多个缓存行为。

源请求策略不是必需的。如果缓存行为未附加源请求策略，则源请求只会包含[缓存策略](cache-key-understand-cache-policy.md)中指定的所有值。

**注意**  
要使用源请求策略，缓存行为还必须使用[缓存策略](controlling-the-cache-key.md)。如果没有缓存策略，则无法在缓存行为中使用源请求策略。

------
#### [ Console ]

**创建源请求策略（控制台）**

1. 登录到 AWS 管理控制台 并通过以下网址在 CloudFront 控制台中打开 **Policies (策略)** 页面：[https://console.aws.amazon.com/cloudfront/v4/home?#/policies](https://console.aws.amazon.com/cloudfront/v4/home?#/policies)。

1. 选择 **Origin request**（源请求），然后选择 **Create origin request policy**（创建源请求策略）。

1. 为此源请求策略选择所需的设置。有关更多信息，请参阅 [了解源请求策略](origin-request-understand-origin-request-policy.md)。

1. 完成后，选择 **Create**（创建）。

创建源请求策略后，可以将它附加到缓存行为。

**将源请求策略附加到现有分配（控制台）**

1. 在 CloudFront 控制台中打开 **Distributions (分配)** 页面，网址为 [https://console.aws.amazon.com/cloudfront/v4/home#/distributions](https://console.aws.amazon.com/cloudfront/v4/home#/distributions)。

1. 选择要更新的分配，然后选择**行为**选项卡。

1. 选择要更新的缓存行为，然后选择**编辑**。

   或者，要创建新的缓存行为，请选择 **Create behavior**(创建行为)。

1. 在 **Cache key and origin requests**（缓存键和源请求）区域，请确保选择了 **Cache policy and origin request policy**（缓存策略和源请求策略）。

1. 对于 **Origin request policy**（源请求策略），选择要附加到此缓存行为的源请求策略。

1. 在页面底部，选择 **Save changes**（保存更改）。

**将源请求策略附加到新分配（控制台）**

1. 通过 打开 CloudFront 控制台[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)

1. 选择 **Create distribution**（创建分配）。

1. 在 **Cache key and origin requests**（缓存键和源请求）区域，请确保选择了 **Cache policy and origin request policy**（缓存策略和源请求策略）。

1. 对于 **Origin request policy**（源请求策略），选择要附加到此分发的原定设置缓存行为的源请求策略。

1. 为源、原定设置缓存行为和其他分配设置选择所需的设置。有关更多信息，请参阅 [所有分配设置参考](distribution-web-values-specify.md)。

1. 完成后，选择 **Create distribution**（创建分配）。

------
#### [ CLI ]

要使用 AWS Command Line Interface (AWS CLI) 创建源请求策略，请使用 **aws cloudfront create-origin-request-policy** 命令。您可以使用输入文件来提供命令的输入参数，而不是将每个单独的参数指定为命令行输入。

**创建源请求策略（带输入文件的 CLI）**

1. 使用以下命令创建名为 `origin-request-policy.yaml` 的文件，其中包含 **create-origin-request-policy** 命令的所有输入参数。

   ```
   aws cloudfront create-origin-request-policy --generate-cli-skeleton yaml-input > origin-request-policy.yaml
   ```

1. 打开刚创建的名为 `origin-request-policy.yaml` 的文件。编辑该文件以指定所需的源请求策略设置，然后保存该文件。您可以从该文件中删除可选字段，但不要删除必填字段。

   有关源请求策略设置的更多信息，请参阅[了解源请求策略](origin-request-understand-origin-request-policy.md)。

1. 使用以下命令通过 `origin-request-policy.yaml` 文件中的输入参数创建源请求策略。

   ```
   aws cloudfront create-origin-request-policy --cli-input-yaml file://origin-request-policy.yaml
   ```

   记下命令输出中的 `Id` 值。这是源请求策略 ID，您需要它才能将源请求策略附加到 CloudFront 分发的缓存行为。

**将源请求策略附加到现有分配（带输入文件的 CLI）**

1. 使用以下命令保存要更新的 CloudFront 分配的分配配置。将 *distribution\$1ID* 替换为分配的 ID。

   ```
   aws cloudfront get-distribution-config --id distribution_ID --output yaml > dist-config.yaml
   ```

1. 打开刚创建的名为 `dist-config.yaml` 的文件。编辑该文件，对要更新的每个缓存行为进行以下更改以使用源请求策略。
   + 在缓存行为中，添加名为 `OriginRequestPolicyId` 的字段。对于字段的值，请使用创建策略后记下的源请求策略 ID。
   + 将 `ETag` 字段重命名为 `IfMatch`，但不更改字段的值。

   完成后保存该文件。

1. 使用以下命令更新分配以使用源请求策略。将 *distribution\$1ID* 替换为分配的 ID。

   ```
   aws cloudfront update-distribution --id distribution_ID --cli-input-yaml file://dist-config.yaml
   ```

**将源请求策略附加到新分配（带输入文件的 CLI）**

1. 使用以下命令创建名为 `distribution.yaml` 的文件，其中包含 **create-distribution** 命令的所有输入参数。

   ```
   aws cloudfront create-distribution --generate-cli-skeleton yaml-input > distribution.yaml
   ```

1. 打开刚创建的名为 `distribution.yaml` 的文件。在默认缓存行为中，在 `OriginRequestPolicyId` 字段中输入创建策略后记下的源请求策略 ID。继续编辑该文件以指定所需的分配设置，然后在完成后保存该文件。

   有关分配设置的更多信息，请参阅[所有分配设置参考](distribution-web-values-specify.md)。

1. 使用以下命令通过 `distribution.yaml` 文件中的输入参数创建分配。

   ```
   aws cloudfront create-distribution --cli-input-yaml file://distribution.yaml
   ```

------
#### [ API ]

要使用 CloudFront API 创建源请求策略，请使用 [CreateOriginRequestPolicy](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateOriginRequestPolicy.html)。有关您在此 API 调用中指定的字段的更多信息，请参阅 [了解源请求策略](origin-request-understand-origin-request-policy.md) 以及 AWS 开发工具包或其他 API 客户端的 API 参考文档。

创建源请求策略后，可以使用下列 API 调用之一将该策略附加到缓存行为：
+ 要将该配置附加到现有分配中的缓存行为，请使用 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。
+ 要将该配置附加到新分配中的缓存行为，请使用 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)。

对于这两个 API 调用，请在缓存行为中的 `OriginRequestPolicyId` 字段中提供源请求策略的 ID。有关您在这些 API 调用中指定的其他字段的更多信息，请参阅 [所有分配设置参考](distribution-web-values-specify.md) 以及有关 AWS SDK 或其他 API 客户端的 API 参考文档。

------

# 使用托管式源请求策略
<a name="using-managed-origin-request-policies"></a>

CloudFront 提供了一组托管源请求策略，您可以将这些策略附加到分配的任意缓存行为。有了托管源请求策略，您无需编写或维护自己的源请求策略。托管策略使用已针对特定使用案例优化的设置。

要使用托管源请求策略，请将它附加到分配中的缓存行为。此过程与创建源请求策略时的过程相同，只不过您只需附加一个托管源请求策略，而不是创建新的源请求策略。您可以按名称（使用控制台）或 ID（使用 AWS CLI 或开发工具包）附加策略。以下部分列出了名称和 ID。

有关更多信息，请参阅 [创建源请求策略](origin-request-create-origin-request-policy.md)。

下面的主题介绍了您可以使用的托管源请求策略。

**Topics**
+ [AllViewer](#managed-origin-request-policy-all-viewer)
+ [AllViewerAndCloudFrontHeaders-2022-06](#managed-origin-request-policy-all-viewer-and-cloudfront)
+ [AllViewerExceptHostHeader](#managed-origin-request-policy-all-viewer-except-host-header)
+ [CORS-CustomOrigin](#managed-origin-request-policy-cors-custom)
+ [CORS-S3Origin](#managed-origin-request-policy-cors-s3)
+ [Elemental-MediaTailor-PersonalizedManifests](#managed-origin-request-policy-mediatailor)
+ [HostHeaderOnly](#managed-origin-request-policy-host-header-only)
+ [UserAgentRefererHeaders](#managed-origin-request-policy-user-agent-referer)

## AllViewer
<a name="managed-origin-request-policy-all-viewer"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/origin/216adef6-5c7f-47e4-b989-5492eafa07d3)

此策略包含来自查看器请求的所有值（标头、Cookie 和查询字符串）。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`216adef6-5c7f-47e4-b989-5492eafa07d3`

此策略包含以下设置：
+ **源请求中包含的标头：**查看器请求中的所有标头
+ **源请求中包含的 Cookie：**全部
+ **源请求中包含的查询字符串：**全部

## AllViewerAndCloudFrontHeaders-2022-06
<a name="managed-origin-request-policy-all-viewer-and-cloudfront"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/origin/33f36d7e-f396-46d9-90e0-52428a34d9dc)

此策略包含来自查看器请求的所有值（标头、Cookie 和查询字符串），以及在 2022 年 6 月之前发布的所有 [CloudFront 标头](adding-cloudfront-headers.md)（不包含 2022 年 6 月之后发布的 CloudFront 标头）。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`33f36d7e-f396-46d9-90e0-52428a34d9dc`

此策略包含以下设置：
+ **源请求中包含的标头：**查看器请求中的所有标头，以及以下 CloudFront 标头：
  + `CloudFront-Forwarded-Proto`
  + `CloudFront-Is-Android-Viewer`
  + `CloudFront-Is-Desktop-Viewer`
  + `CloudFront-Is-IOS-Viewer`
  + `CloudFront-Is-Mobile-Viewer`
  + `CloudFront-Is-SmartTV-Viewer`
  + `CloudFront-Is-Tablet-Viewer`
  + `CloudFront-Viewer-Address`
  + `CloudFront-Viewer-ASN`
  + `CloudFront-Viewer-City`
  + `CloudFront-Viewer-Country`
  + `CloudFront-Viewer-Country-Name`
  + `CloudFront-Viewer-Country-Region`
  + `CloudFront-Viewer-Country-Region-Name`
  + `CloudFront-Viewer-Http-Version`
  + `CloudFront-Viewer-Latitude`
  + `CloudFront-Viewer-Longitude`
  + `CloudFront-Viewer-Metro-Code`
  + `CloudFront-Viewer-Postal-Code`
  + `CloudFront-Viewer-Time-Zone`
  + `CloudFront-Viewer-TLS`
+ **源请求中包含的 Cookie：**全部
+ **源请求中包含的查询字符串：**全部

## AllViewerExceptHostHeader
<a name="managed-origin-request-policy-all-viewer-except-host-header"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/origin/b689b0a8-53d0-40ab-baf2-68738e2966ac)

此策略***不***包括来自查看器请求的 `Host` 标头，但包括来自查看器请求的所有其他值（标头、Cookie 和查询字符串）。

此策略还包括 HTTP 协议、HTTP 版本、TLS 版本以及所有设备类型和查看器位置标头的其他 [CloudFront 请求标头](adding-cloudfront-headers.md)。

本策略适用于Amazon API Gateway 和 AWS Lambda 函数 URL 源。这些源要求 `Host` 标头包含源域名，而不是 CloudFront 分配的域名。将来自查看器请求的 `Host` 标头转发到这些源可能会使它们无法正常运行。

**注意**  
当您使用此托管源请求策略删除查看器的 `Host` 标头时，CloudFront 会在源请求中添加一个包含源域名的新 `Host` 标头。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`b689b0a8-53d0-40ab-baf2-68738e2966ac`

此策略包含以下设置：
+ **源请求中包含的标头：**查看器请求中***除了*** `Host` 标头之外的所有标头
+ **源请求中包含的 Cookie：**全部
+ **源请求中包含的查询字符串：**全部

## CORS-CustomOrigin
<a name="managed-origin-request-policy-cors-custom"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/origin/59781a5b-3903-41f3-afcb-af62929ccde1)

此策略包含在源为自定义源时启用跨源资源共享 (CORS) 请求的标头。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`59781a5b-3903-41f3-afcb-af62929ccde1`

此策略包含以下设置：
+ **源请求中包含的标头：**
  + `Origin`
+ **源请求中包含的 Cookie：**无
+ **源请求中包含的查询字符串：**无

## CORS-S3Origin
<a name="managed-origin-request-policy-cors-s3"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/origin/88a5eaf4-2fd4-4709-b370-b4c650ea3fcf)

此策略包含在源为 Amazon S3 存储桶时启用跨源资源共享 (CORS) 请求的标头。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`88a5eaf4-2fd4-4709-b370-b4c650ea3fcf`

此策略包含以下设置：
+ **源请求中包含的标头：**
  + `Origin`
  + `Access-Control-Request-Headers`
  + `Access-Control-Request-Method`
+ **源请求中包含的 Cookie：**无
+ **源请求中包含的查询字符串：**无

## Elemental-MediaTailor-PersonalizedManifests
<a name="managed-origin-request-policy-mediatailor"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/origin/775133bc-15f2-49f9-abea-afb2e0bf67d2)

此策略旨在与作为 AWS Elemental MediaTailor 端点的源结合使用。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`775133bc-15f2-49f9-abea-afb2e0bf67d2`

此策略包含以下设置：
+ **源请求中包含的标头：**
  + `Origin`
  + `Access-Control-Request-Headers`
  + `Access-Control-Request-Method`
  + `User-Agent`
  + `X-Forwarded-For`
+ **源请求中包含的 Cookie：**无
+ **源请求中包含的查询字符串：**全部

## HostHeaderOnly
<a name="managed-origin-request-policy-host-header-only"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/origin/bf0718e1-ba1e-49d1-88b1-f726733018ae)

此策略仅包含源请求中的 `Host` 标头。它不包含任何查询字符串或 Cookie。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`bf0718e1-ba1e-49d1-88b1-f726733018ae`

此策略包含以下设置：
+ **源请求中包含的标头：**Host
+ **源请求中包含的 Cookie：**无
+ **源请求中包含的查询字符串：**无

## UserAgentRefererHeaders
<a name="managed-origin-request-policy-user-agent-referer"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/origin/acba4595-bd28-49b8-b9fe-13317c0390fa)

此策略仅包含 `User-Agent` 和 `Referer` 标头。它不包含任何查询字符串或 Cookie。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`acba4595-bd28-49b8-b9fe-13317c0390fa`

此策略包含以下设置：
+ **源请求中包含的标头：**
  + `User-Agent`
  + `Referer`
+ **源请求中包含的 Cookie：**无
+ **源请求中包含的查询字符串：**无

# 添加 CloudFront 请求标头
<a name="adding-cloudfront-headers"></a>

您可以对 CloudFront 进行配置，以便向 CloudFront 从查看器收到的请求中添加特定 HTTP 标头并转发到源或[边缘函数](edge-functions.md)。这些 HTTP 标头的值基于查看器或查看器请求的特征。这些标头提供了有关查看器的设备类型、IP 地址、地理位置、请求协议（HTTP 或 HTTPS）、HTTP 版本、TLS 连接详情、[JA3 fingerprint](https://github.com/salesforce/ja3) 以及 JA4 指纹的信息。还可以将分配的缓存行为配置为转发 WebSocket 标头。有关更多信息，请参阅 [将 WebSocket 与 CloudFront 分配结合使用](distribution-working-with.websockets.md)。

有了这些标头，您的源或 Edge 函数可以接收有关查看器的信息，而无需编写自己的代码来确定此信息。如果源根据这些标头中的信息返回不同的响应，您可以将它们包含在*缓存键* 中，以便 CloudFront 分别缓存这些响应。例如，源可能会根据查看器所在的国家/地区以特定语言回复内容，或回复根据特定设备类型量身定制的内容。源也可能会将这些标头写入日志文件，您可以使用这些标头来确定有关查看器所在位置、它们使用的设备类型等信息。

要将这些标头包含在缓存键中，请使用*缓存策略*。有关更多信息，请参阅[使用策略来控制缓存键](controlling-the-cache-key.md)和[了解缓存键](understanding-the-cache-key.md)。

要在源接收这些标头但不将其包含在缓存键中，请使用*源请求策略*。有关更多信息，请参阅 [使用策略来控制源请求](controlling-origin-requests.md)。

**Topics**
+ [设备类型标头](#cloudfront-headers-device-type)
+ [查看器位置标头](#cloudfront-headers-viewer-location)
+ [用于确定查看器的标头结构的标头](#cloudfront-headers-viewer-headers)
+ [与 TLS 相关的标头](#tls-related-versions)
+ [其他 CloudFront 标头](#cloudfront-headers-other)

## 设备类型标头
<a name="cloudfront-headers-device-type"></a>

您可以添加以下标头来确定查看器的设备类型。根据 `User-Agent` 标头的值，CloudFront 将这些标头的值设置为 `true` 或 `false`。如果某个设备归入多个类别中，则可能有多个值为 `true`。例如，对于一些平板电脑设备，CloudFront 会将 `CloudFront-Is-Mobile-Viewer` 和 `CloudFront-Is-Tablet-Viewer` 都设置为 `true`。
+ `CloudFront-Is-Android-Viewer` – 当 CloudFront 确定查看器是采用 Android 操作系统的设备时，设置为 `true`。
+ `CloudFront-Is-Desktop-Viewer` – 当 CloudFront 确定查看器是桌面设备时，设置为 `true`。
+ `CloudFront-Is-IOS-Viewer` – 当 CloudFront 确定查看器是带 Apple 操作系统（如 iPhone、iPod touch 和一些 iPad devices.的设备）时，设置为 `true`。
+ `CloudFront-Is-Mobile-Viewer` – 当 CloudFront 确定查看器是移动设备时，设置为 `true`。
+ `CloudFront-Is-SmartTV-Viewer` – 当 CloudFront 确定查看器是智能电视时，设置为 `true`。
+ `CloudFront-Is-Tablet-Viewer` – 当 CloudFront 确定查看器是平板电脑时，设置为 `true`。

## 查看器位置标头
<a name="cloudfront-headers-viewer-location"></a>

您可以添加以下标头来确定查看器的位置。CloudFront 根据查看器的 IP 地址确定这些标头的值。对于这些标头值中的非 ASCII 字符，CloudFront 将根据 [RFC 3986 的第 1.2 部分](https://tools.ietf.org/html/rfc3986#section-2.1)对字符进行百分比编码。
+ `CloudFront-Viewer-Address` – 包含查看器的 IP 地址和请求的源端口。例如，标头值 `198.51.100.10:46532` 表示查看器的 IP 地址是 198.51.100.10，请求源端口为 46532。
+ `CloudFront-Viewer-ASN` – 包含查看器的自治系统号 (ASN)。
**注意**  
`CloudFront-Viewer-Address` 和 `CloudFront-Viewer-ASN` 可以添加到源请求策略中，但不能添加到缓存策略中。
+ `CloudFront-Viewer-Country` – 包含查看器所在国家/地区的双字母国家/地区代码。有关国家/地区代码的列表，请参阅 [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)。
+ `CloudFront-Viewer-City` – 包含查看器所在城市的名称。

当您添加以下标头时，CloudFront 会将其应用于*除* 那些源自 AWS 网络的请求之外的所有请求：
+ `CloudFront-Viewer-Country-Name` – 包含查看器所在国家/地区的名称。
+ `CloudFront-Viewer-Country-Region` – 包含代表查看器所在区域的代码（最多三个字符）。区域是 [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) 代码的第一级细分（最广泛或最不具体）。
+ `CloudFront-Viewer-Country-Region-Name` – 包含查看器所在区域的名称。区域是 [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) 代码的第一级细分（最广泛或最不具体）。
+ `CloudFront-Viewer-Latitude` – 包含查看器的近似纬度。
+ `CloudFront-Viewer-Longitude` – 包含查看器的近似经度。
+ `CloudFront-Viewer-Metro-Code` – 包含查看器的都市代码。仅当查看器所在地区是美国时提供此项。
+ `CloudFront-Viewer-Postal-Code` – 包含查看器的邮政编码。
+ `CloudFront-Viewer-Time-Zone` 包含查看器的时区，采用 [IANA 时区数据库格式](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)（例如，`America/Los_Angeles`）。

**注意**  
`CloudFront-Viewer-City`、`CloudFront-Viewer-Metro-Code` 和 `CloudFront-Viewer-Postal-Code` 可能并不适用于每个 IP 地址。某些 IP 地址无法以足够的特异性进行地理定位，而无法获取该信息。

## 用于确定查看器的标头结构的标头
<a name="cloudfront-headers-viewer-headers"></a>

您可以添加以下标头来帮助根据查看器发送的标头来识别查看器。例如，不同的浏览器可能会按特定顺序发送 HTTP 标头。如果 `User-Agent` 标头中指定的浏览器与该浏览器的预期标头顺序不匹配，您可以拒绝请求。此外，如果 `CloudFront-Viewer-Header-Count` 值与 `CloudFront-Viewer-Header-Order` 中的标头数量不匹配，您可以拒绝请求。
+ `CloudFront-Viewer-Header-Order` – 按请求的顺序包含查看器的标头名称（用冒号分隔）。例如：`CloudFront-Viewer-Header-Order: Host:User-Agent:Accept:Accept-Encoding`。超过 7680 字符限制的标头将被截断。
+ `CloudFront-Viewer-Header-Count` – 包含查看器标头的总数。

## 与 TLS 相关的标头
<a name="tls-related-versions"></a>

您可以添加以下标头来确定查看器的 JA3 指纹、JA4 指纹和 TLS 连接详细信息：
+ `CloudFront-Viewer-JA3-Fingerprint` – 包含查看器的 [JA3 指纹](https://github.com/salesforce/ja3)。JA3 指纹可帮助您确定请求是来自已知客户端、恶意软件或恶意机器人还是预期的（允许列出的）应用程序。
+ `CloudFront-Viewer-JA4-Fingerprint` – 包含查看器的 JA4 指纹。与 JA3 指纹相似，[JA4 指纹](https://github.com/FoxIO-LLC/ja4)可帮助您确定请求是否来自已知客户端，是否为恶意软件或恶意机器人，或者是否为预期的（加入允许列表中的）应用程序。您可以使用指纹来构建一个包含已知善意和恶意行为者的数据库，以便在检查 HTTP 请求时使用。然后，您可以在应用程序 Web 服务器上或在 [Lambda@Edge](lambda-at-the-edge.md) 和 [CloudFront Functions](cloudfront-functions.md) 中检查标头值，将标头值与已知恶意软件指纹列表进行比较，从而阻止恶意客户端。
+ `CloudFront-Viewer-TLS` – 包含 SSL/TLS 版本、密码以及与查看器和 CloudFront 之间的连接使用的 SSL/TLS 握手相关的信息。标头值采用以下格式：

  ```
  SSL/TLS_version:cipher:handshake_information
  ```

  对于 `handshake_information`，标头可包含以下值：
  + `fullHandshake` – 对 SSL/TLS 会话执行了完全握手。
  + `sessionResumed` – 恢复了先前的 SSL/TLS 会话。
  + `connectionReused` – 重复使用了先前的 SSL/TLS 连接。

  下面是此标头的一些示例值：

  ```
  TLSv1.3:TLS_AES_128_GCM_SHA256:sessionResumed
  ```

  ```
  TLSv1.2:ECDHE-ECDSA-AES128-GCM-SHA256:connectionReused
  ```

  ```
  TLSv1.1:ECDHE-RSA-AES128-SHA256:fullHandshake
  ```

  ```
  TLSv1:ECDHE-RSA-AES256-SHA:fullHandshake
  ```

  有关可能包含在此标头值中的 SSL/TLS 版本和密码的完整列表，请参阅[查看器和 CloudFront 之间支持的协议和密码](secure-connections-supported-viewer-protocols-ciphers.md)。

**备注**  
JA3 和 JA4 指纹源自 SSL/TLS `Client Hello` 数据包。它们仅在 HTTPS 请求中存在。
对于这些与 TLS 相关的标头，您可以将其添加到[源请求策略](controlling-origin-requests.md)中，但不能添加到[缓存策略](controlling-the-cache-key.md)中。

## 其他 CloudFront 标头
<a name="cloudfront-headers-other"></a>

您可以添加以下标头来确定查看器的原始请求 URI，原始请求查询字符串参数，以及值、协议和版本：
+ `CloudFront-Error-Uri` – 包含从查看器收到的原始请求 URI。
+ `CloudFront-Error-Args` – 包含原始请求查询字符串参数和值。
+ `CloudFront-Forwarded-Proto` – 包含查看器请求的协议（HTTP 或 HTTPS）。
+ `CloudFront-Viewer-Http-Version` – 包含查看器请求的 HTTP 版本。

# 了解源请求策略和缓存策略如何协同工作
<a name="understanding-how-origin-request-policies-and-cache-policies-work-together"></a>

您可以使用 CloudFront [源请求策略](controlling-origin-requests.md)来控制 CloudFront 向源发送的请求，这些请求称为*源请求*。要使用源请求策略，必须将[缓存策略](controlling-the-cache-key.md)附加到相同的缓存行为。如果没有缓存策略，则无法在缓存行为中使用源请求策略。有关更多信息，请参阅 [使用策略来控制源请求](controlling-origin-requests.md)。

源请求策略和缓存策略协同工作以确定 CloudFront 在源请求中包含的值。您在缓存键中指定的所有 URL 查询字符串、HTTP 标头和 Cookie（使用缓存策略）都将自动包含在源请求中。您在源请求策略中指定的任何其他查询字符串、标头和 Cookie 也都将包含在源请求中（但不会包含在缓存键中）。

源请求策略和缓存策略的设置似乎相互冲突。例如，一个策略可能允许某些值，而另一个策略可能阻止这些值。下表说明了当您同时使用源请求策略和缓存策略的设置时，CloudFront 在源请求中包含哪些值。这些设置通常适用于所有类型的值（查询字符串、标头和 Cookie），唯一的不同是您无法在缓存策略中指定所有标头或使用标头阻止列表。


|  |  **源请求策略**  |  |  **无**  |  **全部**  |  **允许列表**  |  **阻止列表**  | 
| --- | --- | --- | --- | --- | --- | --- | 
|  **缓存策略**  | 
|  **无**  |  除了每个源请求中包含的默认值外，源请求中不包含来自查看器请求的任何值。有关更多信息，请参阅 [使用策略来控制源请求](controlling-origin-requests.md)。  |  查看器请求中的所有值都将包含在源请求中。  |  只有源请求策略中指定的值才包含在源请求中。  |  ***除了***源请求策略中指定的值，来自查看器请求的所有值都包含在源请求中。  | 
|  **全部** **注意：**您不能在缓存策略中指定所有标头。  |  来自查看器请求的所有查询字符串和 Cookie 都包含在源请求中。  |  查看器请求中的所有值都包含在源请求中。  |  来自查看器请求的所有查询字符串和 Cookie 以及源请求策略中指定的任何标头都包含在源请求中。  |  来自查看器请求的所有查询字符串和 Cookie 都包含在源请求中，即使是源请求策略阻止列表中指定的查询字符串和 Cookie 也是如此。缓存策略设置会覆盖源请求策略阻止列表。  | 
|  **允许列表**  |  只有查看器请求中指定的值会包含在源请求中。  |  查看器请求中的所有值都包含在源请求中。  |  在缓存策略或源请求请求策略中指定的所有值都包含在源请求中。  |  缓存策略中指定的值包含在源请求中，即使在源请求策略阻止列表中指定了相同的值也是如此。缓存策略允许列表将覆盖源请求策略阻止列表。  | 
|  **阻止列表** **注意：**您无法在缓存策略阻止列表中指定标头。  |  ***除了***指定的查询字符串和 Cookie ，来自查看器请求的所有查询字符串和 Cookie 都包含在源请求中。  |  查看器请求中的所有值都包含在源请求中。  |  源请求策略中指定的值包含在源请求中，即使在缓存策略阻止列表中指定了相同的值也是如此。源请求策略允许列表将覆盖缓存策略阻止列表。  |  ***除了***缓存策略或源请求策略中指定的值，来自查看器请求的所有值都包含在源请求中。  | 