根据 Cookie 缓存内容 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

根据 Cookie 缓存内容

默认情况下,在处理请求和响应时,或者在边缘位置缓存对象时, CloudFront 不考虑 Cookie。如果 CloudFront 收到两个除Cookie标头中的内容之外完全相同的请求,则默认情况下, CloudFront 会将这两个请求视为相同,并为两个请求返回相同的对象。

您可以配置 CloudFront 为将查看者请求中的部分或全部 Cookie 转发到您的源,并根据其转发的 Cookie 值缓存对象的不同版本。执行此操作时, CloudFront 使用查看器请求中的部分或全部 Cookie(无论配置为转发哪个)来唯一标识缓存中的对象。

例如,假设 locations.html 的请求包含 country Cookie,其值为 ukfr。当您配置 CloudFront 为基于 country Cookie 的值缓存对象时,会将请求 CloudFront 转发locations.html到源,并包含 country Cookie 及其值。您的源会返回locations.html,如果请求中 CloudFront 有 cookie 的值,则缓存对象一次,对于值为 country uk cookie 的请求,缓存一次对象。fr

重要

Amazon S3 和部分 HTTP 服务器不处理 Cookie。不要配置 CloudFront 为将 Cookie 转发到不处理 Cookie 或不会根据 Cookie 改变其响应的来源。这可能会导致 CloudFront 将更多请求转发到源服务器以获取同一对象,从而降低性能并增加源站的负载。考虑到前面的示例,如果您的源站不处理 country Cookie,或者无论该 Cookie 的locations.html值 CloudFront 如何,始终返回相同版本的,则不要配置 CloudFront 为转发该 Cookie。country

相反,如果您的自定义来源依赖于特定的 Cookie 或基于 Cookie 发送不同的响应,请确保将该 Cookie 配置 CloudFront 为将该 Cookie 转发到源。否则,请在将请求转发到您的来源之前 CloudFront 删除 Cookie。

要配置 Cookie 转发,您需要更新分配的缓存行为。有关缓存行为的更多信息,请参阅缓存行为设置,特别是转发 Cookie允许列表 Cookie部分。

可以配置每个缓存行为以执行下列操作之一:

  • 将@@ 所有 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

    如需了解您可以为每个缓存行为转发的 Cookie 名称的当前数量配额或需要请求提高配额,请参阅查询字符串的配额(旧缓存设置)

  • 不要将 Cookie 转发到您的来源 — CloudFront 不要根据查看者发送的 Cookie 来缓存您的对象。此外, CloudFront 会先删除 Cookie,然后再将请求转发到您的源,并且会在将响应返回给您的查看器之前从响应中删除 Set-Cookie 标头。

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

访问日志

如果您配置 CloudFront 为记录请求和记录 Cookie,则会 CloudFront 记录所有 Cookie 和所有 Cookie 属性,即使您配置为 CloudFront 不将 Cookie 转发到您的来源,或者您配置 CloudFront 为仅转发特定 Cookie。有关 CloudFront 日志记录的更多信息,请参阅配置和使用标准日志(访问日志)

区分大小写

Cookie 的名称和值都要区分大小写。例如,如果配置 CloudFront 为转发所有 Cookie,并且对同一对象的两个查看者请求的 CloudFront Cookie 除大小写之外都相同,则会将该对象缓存两次。

CloudFront 整理饼干

如果配置 CloudFront 为转发 Cookie(全部或子集),则在将请求转发到您的来源之前,请按照 Cookie 名称按自然顺序对 Cookie 进行 CloudFront 排序。

If-Modified-SinceIf-None-Match

If-Modified-Since如果 CloudFront 配置为转发 Cookie(全部或子集),则不支持If-None-Match条件请求。

需要标准名称/值对格式

CloudFront 仅当值符合标准名称-值对格式时,才会转发 cookie 标头,例如:"Cookie: cookie1=value1; cookie2=value2"

禁止对 Set-Cookie 标头进行缓存

如果 CloudFront 配置为将 Cookie 转发到源(无论是全部还是特定 Cookie),它还会缓存源响应中收到的Set-Cookie标头。 CloudFront 在对原始查看者的响应中包含这些Set-Cookie标头,也将它们包含在 CloudFront 缓存中提供的后续响应中。

如果您想在源站接收 Cookie,但又不 CloudFront 想在来源的响应中缓存Set-Cookie标头,请将您的来源配置为添加带有指定Set-Cookie为字段名称的no-cache指令的Cache-Control标头。例如:Cache-Control: no-cache="Set-Cookie"。有关更多信息,请参阅超文本传输协议 (HTTP/1.1):缓存 标准中的响应缓存控制指令

Cookie 名称的最大长度

如果您配置 CloudFront 为将特定 Cookie 转发到您的来源,则您配置 CloudFront 为转发的所有 Cookie 名称中的总字节数不能超过 512 减去您正在转发的 Cookie 数量。例如,如果您配置为将 10 个 Cookie 转发 CloudFront 到您的来源,则这 10 个 Cookie 名称的总长度不能超过 502 字节(512 — 10)。

如果您配置 CloudFront 为将所有 Cookie 转发到您的来源,那么 Cookie 名称的长度无关紧要。

有关使用 CloudFront 控制台更新分配以便将 Cookie CloudFront 转发给源的信息,请参阅更新分配。有关使用 CloudFront API 更新分配的信息,请参阅 Amazon CloudFront API 参考UpdateDistribution中的。