

# 根据 Cookie 缓存内容
<a name="Cookies"></a>

默认情况下，CloudFront 在处理请求和响应时或在边缘站点中缓存对象时，不考虑 Cookie。如果 CloudFront 收到两个内容相同（仅 `Cookie` 标头中的内容不同）的请求，默认情况下，CloudFront 会将这两个请求视为相同并为它们返回相同的对象。

您可以将 CloudFront 配置为将查看器请求中的部分或所有 Cookie 转发到您的源，以及基于转发的 Cookie 值缓存对象的单独版本。在执行此操作时，CloudFront 将使用查看器请求中的部分或所有 Cookie（无论配置为转发哪些 Cookie）来唯一标识缓存中的对象。

例如，假设 `locations.html` 的请求包含 `country` Cookie，其值为 `uk` 或 `fr`。在将 CloudFront 配置为根据 `country` Cookie 的值缓存对象时，CloudFront 会将 `locations.html` 请求转发到源并包含 `country` Cookie 及其值。源返回 `locations.html`，并且 CloudFront 为具有 `country` Cookie 值 `uk` 的请求缓存对象一次，为具有 Cookie 值 `fr` 的请求缓存一次。

**重要**  
Amazon S3 和部分 HTTP 服务器不处理 Cookie。请不要将 CloudFront 配置为将 Cookie 转发到不处理 Cookie 或不根据 Cookie 改变其响应的源。这可能会导致 CloudFront 将更多请求转发到同一对象的源，从而降低性能并增加源上的负载。考虑到上一个示例，如果您的源不处理 `country` Cookie，或者始终将相同版本的 `locations.html` 返回到 CloudFront，而不考虑 `country` Cookie 的值，请不要将 CloudFront 配置为转发该 Cookie。  
相反，如果您的自定义源依赖于某个特定的 Cookie，或者根据 Cookie 发送不同的响应，请确保将 CloudFront 配置为将该 Cookie 转发到源。否则，CloudFront 会在将请求转发到您的源之前删除该 Cookie。

要配置 Cookie 转发，您需要更新分配的缓存行为。有关缓存行为的更多信息，请参阅[缓存行为设置](DownloadDistValuesCacheBehavior.md)，特别是[转发 Cookie](DownloadDistValuesCacheBehavior.md#DownloadDistValuesForwardCookies) 和[允许列表 Cookie](DownloadDistValuesCacheBehavior.md#DownloadDistValuesAllowlistCookies)部分。

可以配置每个缓存行为以执行下列操作之一：
+ **将所有 Cookie 转发到您的源** – CloudFront 包含查看器在将请求转发到源时发送的所有 Cookie。当源返回响应时，CloudFront 会使用查看器请求中的 Cookie 名称和值来缓存响应。如果源响应包含 `Set-Cookie` 标头，CloudFront 会将其与请求的对象一起返回给查看器。CloudFront 还与从源返回的对象一起缓存 `Set-Cookie` 标头，并在所有缓存命中时将这些 `Set-Cookie` 标头发送给查看器。
+ **转发您指定的 Cookie 集** – CloudFront 将删除查看器发送的未列入允许名单的所有 Cookie，然后再将请求转发到源。CloudFront 使用查看器请求中列出的 cookie 名称和值缓存响应。如果源响应包含 `Set-Cookie` 标头，CloudFront 会将其与请求的对象一起返回给查看器。CloudFront 还与从源返回的对象一起缓存 `Set-Cookie` 标头，并在所有缓存命中时将这些 `Set-Cookie` 标头发送给查看器。

  有关在 Cookie 名称中指定通配符的信息，请参阅[允许列表 Cookie](DownloadDistValuesCacheBehavior.md#DownloadDistValuesAllowlistCookies)。

  如需了解您可以为每个缓存行为转发的 Cookie 名称的当前数量配额或需要请求提高配额，请参阅[查询字符串的配额（旧缓存设置）](cloudfront-limits.md#limits-allowlisted-query-strings)。
+ **不将 Cookie 转发到源** – CloudFront 不根据查看器发送的 Cookie 缓存您的对象。此外，CloudFront 会先删除 Cookie，然后再将请求转发到您的源，并且会在将响应返回给您的查看器之前从响应中删除 `Set-Cookie` 标头。由于这不是使用源资源的最佳方式，因此当您选择此缓存行为时，应确保您的源默认情况下不在源响应中包含 Cookie。

请注意以下有关指定要转发的 Cookie 的信息：

**访问日志**  
如果将 CloudFront 配置为记录请求和 Cookie，则 CloudFront 会记录所有 Cookie 以及所有 Cookie 属性，即使将 CloudFront 配置为不将 Cookie 转发到源，或者将 CloudFront 配置为仅转发特定的 Cookie。有关 CloudFront 日志记录的更多信息，请参阅[访问日志（标准日志）](AccessLogs.md)。

**区分大小写**  
Cookie 的名称和值都要区分大小写。例如，如果将 CloudFront 配置为转发所有 Cookie，并且同一对象的两个查看器请求具有相同的 Cookie（仅大小写不同），则 CloudFront 会将该对象缓存两次。

**CloudFront 对 cookie 进行排序**  
如果将 CloudFront 配置为转发 Cookie（全部或某个子集），则 CloudFront 会在将请求转发到您的源之前以自然顺序按 Cookie 名称对 Cookie 进行排序。  
 不支持以 `$` 字符开头的 Cookie 名称。CloudFront 会在将请求转发到源之前移除该 Cookie。可以删除 `$` 字符或在 Cookie 名称的开头指定其它字符。

**`If-Modified-Since`和`If-None-Match`**  
如果将 CloudFront 配置为转发 Cookie（全部或某个子集），则不支持 `If-Modified-Since` 和 `If-None-Match` 条件请求。

**需要标准名称/值对格式**  
CloudFront 仅在值遵循[标准名称/值对格式](https://tools.ietf.org/html/rfc6265#section-4.1.1)时转发 Cookie 标头，例如：`"Cookie: cookie1=value1; cookie2=value2"`

**禁止对 `Set-Cookie` 标头进行缓存**  
如果将 CloudFront 配置为将 Cookie 转发到源（全部或特定的 Cookie），它还会缓存源响应中收到的 `Set-Cookie` 标头。CloudFront 在其对原始查看器的响应中包括这些 `Set-Cookie` 标头，并将它们包含在从 CloudFront 缓存提供的后续响应中。  
如果您希望在源处接收 Cookie，但不希望 CloudFront 在源的响应中缓存 `Set-Cookie` 标头，请将源配置为使用指定 `Cache-Control` 作为字段名的 `no-cache` 指令来添加 `Set-Cookie` 标头。例如：`Cache-Control: no-cache="Set-Cookie"`。有关更多信息，请参阅*超文本传输协议 (HTTP/1.1)：缓存* 标准中的[响应缓存控制指令](https://tools.ietf.org/html/rfc7234#section-5.2.2)。

**Cookie 名称的最大长度**  
如果将 CloudFront 配置为将特定的 Cookie 转发到源，则配置为由 CloudFront 转发的所有 Cookie 名称的总字节数不能超过 512 与您转发的 Cookie 数的差。例如，如果您将 CloudFront 配置为将 10 个 Cookie 转发到源，则 10 个 Cookie 的名称组合长度不能超过 502 个字节 (512 - 10)。  
如果您将 CloudFront 配置为将所有 Cookie 转发到源，Cookie 名称的长度没有关系。

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