本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
根据 Cookie 缓存内容
默认情况下,在处理请求和响应时,或者在边缘位置缓存对象时, CloudFront 不考虑 Cookie。如果 CloudFront 收到两个除Cookie
标头中的内容之外完全相同的请求,则默认情况下, CloudFront 会将这两个请求视为相同,并为两个请求返回相同的对象。
您可以配置 CloudFront 为将查看者请求中的部分或全部 Cookie 转发到您的源,并根据其转发的 Cookie 值缓存对象的不同版本。执行此操作时, CloudFront 使用查看器请求中的部分或全部 Cookie(无论配置为转发哪个)来唯一标识缓存中的对象。
例如,假设 locations.html
的请求包含 country
Cookie,其值为 uk
或 fr
。当您配置 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-Since
和If-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中的。