

# 根据请求标头缓存内容
<a name="header-caching"></a>

CloudFront 允许您选择是否希望 CloudFront 将标头转发到源并根据查看器请求中的标头值缓存指定对象的不同版本。这样，您便可以根据用户使用的设备、查看器的位置、查看器使用的语言及各种其他条件来提供内容的不同版本。

**Topics**
+ [标头和分配 – 概述](#header-caching-web)
+ [选择缓存所基于的标头](#header-caching-web-selecting)
+ [将 CloudFront 配置为遵守 CORS 设置](#header-caching-web-cors)
+ [配置基于设备类型的缓存](#header-caching-web-device)
+ [配置基于查看器语言的缓存](#header-caching-web-language)
+ [配置基于查看器位置的缓存](#header-caching-web-location)
+ [配置基于请求协议的缓存](#header-caching-web-protocol)
+ [为压缩文件配置缓存](#header-caching-web-compressed)
+ [根据标头进行缓存如何影响性能](#header-caching-web-performance)
+ [标头和标头值的大小写如何影响缓存](#header-caching-web-case)
+ [CloudFront 返回给查看器的标头](#header-caching-web-response)

## 标头和分配 – 概述
<a name="header-caching-web"></a>

默认情况下，CloudFront 在边缘站点中缓存对象时不考虑标头。如果源返回两个对象并且这两个对象仅有请求标头中的值不同，CloudFront 仅缓存对象的一个版本。

您可以将 CloudFront 配置为将标头转发到源，这会导致 CloudFront 根据一个或多个请求标头中的值缓存某个对象的多个版本。要根据特定标头的值配置 CloudFront 以缓存对象，请为分配指定缓存行为设置。有关更多信息，请参阅[基于选择的请求标头进行缓存](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesForwardHeaders)。

例如，假设 `logo.jpg` 的查看器请求包含自定义 `Product` 标头，其值为 `Acme` 或 `Apex`。当您将 CloudFront 配置为基于 `Product` 标头的值缓存对象时，CloudFront 将针对 `logo.jpg` 的请求转发到源并包括 `Product` 标头和标头值。CloudFront 为 `logo.jpg` 标头中值为 `Product` 的请求缓存 `Acme` 一次，为其中值为 `Apex` 的请求缓存一次。

可以在分配中配置每个缓存行为，以执行以下操作之一：
+ 将所有标头转发到源
**注意**  
**对于旧缓存设置** - 如果您将 CloudFront 配置为将所有标头转发到源，则 CloudFront 不会缓存与此缓存行为关联的对象。相反，它会将每个请求发送到源。
+ 转发您指定的标头列表。CloudFront 会基于所有指定标头中的值缓存对象。CloudFront 默认还会转发其转发的标头，但它仅基于指定的标头缓存对象。
+ 仅转发默认标头。在此配置中，CloudFront 不会基于请求标头中的值缓存您的对象。

如需了解您可以为每个缓存行为转发的标头的当前数量配额或请求提高配额，请参阅[标头的配额](cloudfront-limits.md#limits-custom-headers)。

有关使用 CloudFront 控制台更新分配以使 CloudFront 将标头转发到源的信息，请参阅[更新分配](HowToUpdateDistribution.md)。有关使用 CloudFront API 更新现有分配的信息，请参阅《Amazon CloudFront API 参考》**中的 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。

## 选择缓存所基于的标头
<a name="header-caching-web-selecting"></a>

您可以转发到源以及 CloudFront 进行缓存所基于的标头取决于您的源是 Amazon S3 存储桶还是自定义源。
+ **Amazon S3** – 您可以将 CloudFront 配置为根据特定标头的数量缓存您的对象（请参阅下面的例外情况列表）。但是，建议您避免使用 Amazon S3 源转发标头，除非您需要实施跨源资源共享（CORS），或者想要通过在面向源的事件中使用 Lambda@Edge 来对内容进行个性化设置。
  + 要配置 CORS，您必须转发允许 CloudFront 为启用了跨源资源共享 (CORS) 的网站分配内容的标头。有关更多信息，请参阅 [将 CloudFront 配置为遵守 CORS 设置](#header-caching-web-cors)。
  + 要通过使用转发至您的 Amazon S3 源的标头对内容进行个性化设置，请编写和添加 Lambda@Edge 函数，并将这些函数与要由某个面向源的事件触发的 CloudFront 分配相关联。有关使用标头对内容进行个性化设置的更多信息，请参阅[按国家/地区或设备类型标头个性化内容 - 示例](lambda-examples.md#lambda-examples-redirecting-examples)。

    建议您避免转发并非用于对内容进行个性化设置的标头，因为转发额外的标头可能会降低您的缓存命中率。即，CloudFront 无法从边缘缓存来服务与所有请求中占的比例一样多的请求。
+ **自定义源** – 您可以将 CloudFront 配置为根据以下项以外的任意请求标头的值进行缓存：
  + `Connection`
  + `Cookie` – 如果希望根据 Cookie 转发和缓存，您可以在分配中使用单独的设置。有关更多信息，请参阅 [根据 Cookie 缓存内容](Cookies.md)。
  + `Host (for Amazon S3 origins)`
  + `Proxy-Authorization`
  + `TE`
  + `Upgrade`

  您可以将 CloudFront 配置为基于 `Date` 和 `User-Agent` 标头中的值缓存对象，但建议您不要这样做。这些标头具有大量可能的值，并且基于其值的缓存操作会导致 CloudFront 将更多请求转发到源。

有关 HTTP 请求标头的完整列表以及 CloudFront 如何处理这些标头，请参阅[HTTP 请求标头和 CloudFront 行为（自定义源和 Amazon S3 源）](RequestAndResponseBehaviorCustomOrigin.md#request-custom-headers-behavior)。

## 将 CloudFront 配置为遵守 CORS 设置
<a name="header-caching-web-cors"></a>

如果您已在 Amazon S3 存储桶或自定义源上启用跨源资源共享 (CORS)，则必须选择要转发的特定标头以遵守 CORS 设置。您必须转发的标头因源（Amazon S3 或自定义）及您是否要缓存 `OPTIONS` 响应而异。

**Amazon S3**
+ 如果要缓存 `OPTIONS` 响应，请执行以下操作：
  + 为默认缓存行为设置选择启用 `OPTIONS` 响应缓存的选项。
  + 配置 CloudFront 以转发以下标头：`Origin`、`Access-Control-Request-Headers`、和 `Access-Control-Request-Method`。
+ 如果您不希望缓存 `OPTIONS` 响应，请将 CloudFront 配置为转发 `Origin` 标头以及源所需的任何其他标头（例如 `Access-Control-Request-Headers`、`Access-Control-Request-Method` 或其他）。

**自定义源** – 转发 `Origin` 标头以及源所需的任何其他标头。

要将 CloudFront 配置为根据 CORS 缓存响应，必须将 CloudFront 配置为使用缓存策略转发标头。有关更多信息，请参阅 [使用策略来控制缓存键](controlling-the-cache-key.md)。

有关 CORS 和 Amazon S3 的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[启用跨源资源共享（CORS）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/cors.html)。

## 配置基于设备类型的缓存
<a name="header-caching-web-device"></a>

如果您希望 CloudFront 基于用户查看内容所用设备来缓存不同版本的对象，可将 CloudFront 配置为将合适的标头转发给您的自定义源：
+ `CloudFront-Is-Desktop-Viewer`
+ `CloudFront-Is-Mobile-Viewer`
+ `CloudFront-Is-SmartTV-Viewer`
+ `CloudFront-Is-Tablet-Viewer`

根据 `User-Agent` 标头的值，在将请求转发给您的源之前，CloudFront 将这些标头的值设置为 `true` 或 `false`。如果某个设备归入多个类别中，则多个值可能为 `true`。例如，对于一些平板电脑设备，CloudFront 可能将 `CloudFront-Is-Mobile-Viewer` 和 `CloudFront-Is-Tablet-Viewer` 设置为 `true`。

## 配置基于查看器语言的缓存
<a name="header-caching-web-language"></a>

如果您希望 CloudFront 根据请求中指定的语言缓存对象的不同版本，请将 CloudFront 配置为将 `Accept-Language` 标头转发到源。

## 配置基于查看器位置的缓存
<a name="header-caching-web-location"></a>

如果您希望 CloudFront 根据发出请求的国家/地区缓存对象的不同版本，请将 CloudFront 配置为将 `CloudFront-Viewer-Country` 标头转发到源。CloudFront 自动将发出请求的 IP 地址转换为两个字母的国家/地区代码。要获取可按代码和国家/地区名称排序的易于使用的国家/地区代码列表，请参阅 Wikipedia 条目 [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)。

## 配置基于请求协议的缓存
<a name="header-caching-web-protocol"></a>

如果您希望 CloudFront 根据请求的协议（HTTP 或 HTTPS）缓存对象的不同版本，请配置 CloudFront 以将 `CloudFront-Forwarded-Proto` 标头转发到源。

## 为压缩文件配置缓存
<a name="header-caching-web-compressed"></a>

如果源支持 Brotli 压缩，您可以基于 `Accept-Encoding` 标头进行缓存。仅当源根据 `Accept-Encoding` 标头处理不同内容时基于该标头配置缓存。

## 根据标头进行缓存如何影响性能
<a name="header-caching-web-performance"></a>

在您将 CloudFront 配置为基于一个或多个标头进行缓存并且标头有多个可能值时，CloudFront 会为同一个对象将多个请求转发到您的源服务器。这会降低性能并增加源服务器上的负载。如果不管指定标头的值如何，源服务器均返回相同的对象，建议您不要将 CloudFront 配置为基于该标头进行缓存。

如果您将 CloudFront 配置为转发多个标头，只要值相同，查看器请求中的标头顺序对缓存没有影响。例如，如果一个请求包含标头 A:1,B:2，而另一个请求包含 B:2,A:1，CloudFront 只缓存对象的一个副本。

## 标头和标头值的大小写如何影响缓存
<a name="header-caching-web-case"></a>

根据标头值进行缓存时，CloudFront 不会考虑标头名称的大小写，但是会考虑标头值的大小写：
+ 如果查看器请求同时包含 `Product:Acme` 和 `product:Acme`，CloudFront 仅缓存对象一次。它们之间唯一的差别是标头名称的大小写，这不会影响缓存。
+ 如果查看器请求同时包括 `Product:Acme` 和 `Product:acme`，CloudFront 缓存对象两次，因为在一些请求中具有值 `Acme`，而在另一些请求中具有值 `acme`。

## CloudFront 返回给查看器的标头
<a name="header-caching-web-response"></a>

将 CloudFront 配置为转发和缓存标头不会影响 CloudFront 返回给查看器的标头。CloudFront 返回从源获取的所有标头，只有少数几个例外。有关更多信息，请参阅相关主题：
+ **Amazon S3 源** – 请参阅[CloudFront 删除或更新的 HTTP 响应标头](RequestAndResponseBehaviorS3Origin.md#response-s3-removed-headers)。
+ **自定义源** – 请参阅[CloudFront 移除或替换的 HTTP 响应标头](RequestAndResponseBehaviorCustomOrigin.md#ResponseCustomRemovedHeaders)。