

# 向源请求添加自定义标头
<a name="add-origin-custom-headers"></a>

您可以配置 CloudFront 以便向发送到您的源的请求中添加自定义标头。您可以使用这些自定义标头，从源发送和收集通过典型查看器请求无法获得的信息。您甚至可以针对每个源自定义这些标头。CloudFront 支持用于自定义源和 Amazon S3 源的自定义标头。

**Contents**
+ [使用案例](#add-origin-custom-headers-use-cases)
+ [配置 CloudFront 以便向源请求添加自定义标头](#add-origin-custom-headers-configure)
+ [CloudFront 无法添加到源请求的自定义标头](#add-origin-custom-headers-denylist)
+ [配置 CloudFront 以转发 `Authorization` 标头](#add-origin-custom-headers-forward-authorization)

## 使用案例
<a name="add-origin-custom-headers-use-cases"></a>

您可以使用自定义标头，如下例所示：

**识别来自 CloudFront 的请求**  
您可以标识您的源从 CloudFront 接收的请求。如果您想知道用户是否绕过 CloudFront，或者您使用了多个 CDN 并且希望了解有关哪些请求来自每个 CDN 的信息，此功能很有用。  
（如果您使用 Amazon S3 源并启用 [Amazon S3 服务器访问日志记录](https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerLogs.html)，日志将不包含标头信息。）

**确定哪些请求来自于特定分配**  
如果您配置多个 CloudFront 分配以使用相同的源，则可以在每个分配中添加不同的自定义标头。然后，可以使用来自您的源中的日志，确定哪些请求来自于哪个 CloudFront 分配。

**允许跨源资源共享 (CORS)**  
如果您的某些查看器不支持跨源资源共享 (CORS)，则可以配置 CloudFront，以便始终将 `Origin` 标头添加到发送到您的源的请求中。然后，可以配置您的源，以便为每个请求返回 `Access-Control-Allow-Origin` 标头。您还必须将 [CloudFront 配置为遵守 CORS 设置](header-caching.md#header-caching-web-cors)。

**控制对内容的访问**  
可以使用自定义标头来控制对内容的访问。通过配置源以便仅在请求包含 CloudFront 添加的自定义标头时才响应请求，您可以防止用户绕过 CloudFront 并直接访问源上的内容。有关更多信息，请参阅 [在自定义源上限制对文件的访问](private-content-overview.md#forward-custom-headers-restrict-access)。

## 配置 CloudFront 以便向源请求添加自定义标头
<a name="add-origin-custom-headers-configure"></a>

要配置分配以便向其发送到源的请求添加自定义标头，请使用以下方法之一更新源配置：
+ **CloudFront 控制台** – 在创建或更新分配时，请在**添加自定义标头**设置中指定标头名称和值。有关更多信息，请参阅 [添加自定义标头](DownloadDistValuesOrigin.md#DownloadDistValuesOriginCustomHeaders)。
+ **CloudFront API** – 对于要添加自定义标头的每个源，请在 `Origin` 内部的 `CustomHeaders` 字段中指定标头名称和值。有关更多信息，请参阅《Amazon CloudFront API 参考》**中的 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html) 或 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。

如果您指定的标头名称和值在查看器请求中尚不存在，CloudFront 会将这些标头名称和值添加到源请求。如果标头存在，CloudFront 会在将请求转发到源之前覆盖该标头值。

有关适用于源自定义标头的配额，请参阅[标头的配额](cloudfront-limits.md#limits-custom-headers)。

## CloudFront 无法添加到源请求的自定义标头
<a name="add-origin-custom-headers-denylist"></a>

您无法配置 CloudFront 以便将以下任意标头添加到发送到您的源的请求：
+ `Cache-Control`
+ `Connection`
+ `Content-Length`
+ `Cookie`
+ `Host`
+ `If-Match`
+ `If-Modified-Since`
+ `If-None-Match`
+ `If-Range`
+ `If-Unmodified-Since`
+ `Max-Forwards`
+ `Pragma`
+ `Proxy-Authenticate`
+ `Proxy-Authorization`
+ `Proxy-Connection`
+ `Range`
+ `Request-Range`
+ `TE`
+ `Trailer`
+ `Transfer-Encoding`
+ `Upgrade`
+ `Via`
+ 以 `X-Amz-` 开头的标头
+ 以 `X-Edge-` 开头的标头
+ `X-Real-Ip`

## 配置 CloudFront 以转发 `Authorization` 标头
<a name="add-origin-custom-headers-forward-authorization"></a>

当 CloudFront 转发查看器请求到您的源时，默认情况下，CloudFront 会删除一些查看器标头，包括 `Authorization` 标头。为了确保您的源始终能接收到源请求中的 `Authorization` 标头，您可以选择以下几种方式：
+ 使用缓存策略将 `Authorization` 标头添加到缓存键中。源请求会自动包含缓存键中的所有标头。有关更多信息，请参阅 [使用策略来控制缓存键](controlling-the-cache-key.md)。
+ 使用将所有查看器标头转发到源的源请求策略。您无法通过源请求策略单独转发 `Authorization` 标头；当您使用该策略转发所有查看器标头时，CloudFront 会将 `Authorization` 标头包含在查看器请求中。针对此用例，CloudFront 提供了名为 **Managed-AllViewer** 的托管源请求策略。有关更多信息，请参阅 [使用托管式源请求策略](using-managed-origin-request-policies.md)。