根据 Cookie 缓存内容 - Amazon CloudFront

根据 Cookie 缓存内容

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

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

例如,假设 locations.html 的请求包含 country Cookie,其值为 ukfr。在将 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 转发,您需要更新分配的缓存行为。有关缓存行为的更多信息,请参阅缓存行为设置,特别是转发 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。

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

访问日志

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

区分大小写

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

CloudFront 对 cookie 进行排序

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

注意

不支持以 $ 字符开头的 Cookie 名称。CloudFront 会在将请求转发到源之前移除该 Cookie。可以删除 $ 字符或在 Cookie 名称的开头指定其它字符。

If-Modified-SinceIf-None-Match

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

需要标准名称/值对格式

CloudFront 仅在值遵循标准名称/值对格式时转发 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):缓存 标准中的响应缓存控制指令

Cookie 名称的最大长度

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

如果您将 CloudFront 配置为将所有 Cookie 转发到源,Cookie 名称的长度没有关系。

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