

# 添加 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 版本。