管理内容保留在缓存中的时间长度(过期) - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

管理内容保留在缓存中的时间长度(过期)

在将另一个请求 CloudFront 转发到您的源之前,您可以控制文件在 CloudFront 缓存中保留多长时间。减少持续时间让您可提供动态内容。增加持续时间意味着您的用户将获得更好的性能,因为直接从边缘缓存提供文件的可能性更大。较长的持续时间还会减少源的负载。

通常,从边缘位置 CloudFront 提供文件,直到您指定的缓存持续时间过去为止,也就是说,直到文件过期。过期后,下次边缘站点收到文件请求时,会将该请求 CloudFront 转发到源站以验证缓存中是否包含文件的最新版本。来自源的响应取决于文件是否已更改:

  • 如果 CloudFront 缓存已有最新版本,则源会返回状态码304 Not Modified

  • 如果 CloudFront 缓存没有最新版本,则源会返回状态码200 OK和文件的最新版本。

如果不经常请求边缘位置的文件,则 CloudFront 可能会移出该文件(在文件到期日期之前将其删除),以便为最近请求的文件腾出空间。

默认情况下,每个文件在 24 小时后自动过期,但您可以通过以下两种方式来更改默认行为:

有关 Minimum TTL(最小 TTL)、Default TTL(原定设置 TTL)和 Maximum TTL(最大 TTL)如何与 max-ages-maxage 指令以及 Expires 标头字段交互的更多信息,请参阅指定 CloudFront 缓存对象的时间长度

您还可以通过将另一个请求转发到您的源来控制错误(例如404 Not Found)在再次 CloudFront 尝试获取请求的对象之前在CloudFront 缓存中停留多长时间。有关更多信息,请参阅如何 CloudFront 处理和缓存来自您的源的 HTTP 4xx 和 5xx 状态代码

使用标头控制单独对象的缓存时间长度

您可以使用 Cache-ControlExpires 标头控制对象保留在缓存中的时间长度。Minimum TTLDefault TTLMaximum TTL 的设置也会影响缓存时间长度,不过此处只简要说明标头对缓存时间长度的影响:

  • Cache-Control max-age指令允许您指定在再次从源服务器 CloudFront 获取对象之前,您希望对象在缓存中保留多长时间(以秒为单位)。 CloudFront 支持的最短到期时间为 0 秒。最大值为 100 年。采用以下格式指定值:

    Cache-Control: max-age=

    例如,以下指令要求 CloudFront 将关联的对象保存在缓存中 3600 秒(一小时):

    Cache-Control: max-age=3600

    如果您希望对象在 CloudFront 边缘缓存中停留的时间与它们在浏览器缓存中的停留时间不同,则可以同时使用Cache-Control max-age和指Cache-Control s-maxage令。有关更多信息,请参阅指定 CloudFront 缓存对象的时间长度

  • Expires标头字段让您使用 RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1 Section 3.3.1, Full Date 中指定的格式指定过期日期和时间,例如:

    Sat, 27 Jun 2015 23:59:59 GMT

建议您使用 Cache-Control max-age 指令代替 Expires 标头字段,以控制对象缓存。如果您同时指定 Cache-Control max-ageExpires 值,则 CloudFront 仅使用 Cache-Control max-age 值。

有关更多信息,请参阅指定 CloudFront 缓存对象的时间长度

您不能在查看者的GET请求中使用 HTTP Cache-ControlPragma标头字段 CloudFront 来强制返回对象的源服务器。 CloudFront 忽略查看者请求中的这些标题字段。

有关 Cache-ControlExpires 标头字段的更多信息,请参阅《RFC 2616,超文本传输协议 – HTTP/1.1》中以下章节:

提供过时(过期)的内容

CloudFront 支持Stale-While-RevalidateStale-If-Error缓存控制指令。

  • stale-while-revalidate指令 CloudFront 允许从缓存中提供陈旧的内容,同时从源站异步获取新版本。这可以缩短延迟,因为用户无需等待后台提取即可立即收到来自 CloudFront边缘位置的响应,并且新内容会在后台加载以备将来的请求使用。

    在以下示例中,将响应 CloudFront 缓存一小时 (max-age=3600)。如果请求是在此时段之后提出的,则会CloudFront 提供陈旧的内容,同时向源发送请求以重新验证和刷新缓存的内容。在重新验证内容期间,过时内容最多可提供 10 分钟(stale-while-revalidate=600)。

    Cache-Control: max-age=3600, stale-while-revalidate=600
  • 如果来源无法访问或返回的错误代码介于 500 到 600 之间,则该stale-if-error指令允许 CloudFront 从缓存中提供陈旧内容。这可确保查看器即使在源中断期间也可以访问内容。

    在以下示例中,将响应 CloudFront 缓存一小时 (max-age=3600)。如果源站关闭或在此时间段后返回错误,则会 CloudFront 继续提供陈旧内容最多 24 小时(stale-if-error=86400)。

    Cache-Control: max-age=3600, stale-if-error=86400
    注意

    如果同时配置stale-if-error自定义错误响应,则如果在指定的stale-if-error持续时间内遇到错误,则 CloudFront 首先尝试提供陈旧的内容。如果陈旧内容不可用,或者内容已超过stale-if-error持续时间,则 CloudFront 提供为相应错误状态代码配置的自定义错误响应。

将两者一起使用

stale-while-revalidatestale-if-error 是独立的缓存控制指令,可以一起使用以减少延迟并为您的源添加缓冲区以进行响应或恢复。

在以下示例中,将响应 CloudFront 缓存一小时 (max-age=3600)。如果在此期限之后提出请求,则CloudFront 在重新验证内容期间,将陈旧内容最多保存 10 分钟 (stale-while-revalidate=600)。如果源服务器在 CloudFront 尝试重新验证内容时返回错误,则会 CloudFront 继续提供陈旧内容最多 24 小时()stale-if-error=86400

Cache-Control: max-age=3600, stale-while-revalidate=600, stale-if-error=86400
提示

缓存是性能和新鲜度之间的平衡。使用 stale-while-revalidatestale-if-error 之类的指令可以增强性能和用户体验,但要确保配置与您所需的内容新鲜度相一致。过时内容指令最适合需要刷新内容但并非必须具有最新版本的使用案例。此外,如果您的内容没有更改或极少更改,stale-while-revalidate 可能会增加不必要的网络请求。相反,可以考虑设置较长的缓存持续时间。

指定 CloudFront 缓存对象的时间长度

要控制在向源服务器发送另一个请求之前将对象 CloudFront 保留在缓存中的时间,您可以:

  • 在 CloudFront 分配的缓存行为中设置最小、最大和默认 TTL 值。您可以在附加到缓存行为的缓存策略中设置这些值(推荐),或在原有缓存设置中进行设置。

  • Cache-ControlExpires 标头包含在来自源的响应中。这些标头还有助于确定浏览器在向其发送另一个请求之前在浏览器缓存中保留对象多长时间 CloudFront。

下表说明了从源发送的 Cache-ControlExpires 标头如何与缓存行为中的 TTL 设置配合使用,从而影响缓存的。

源标头 最小 TTL = 0 最小 TTL > 0

源将 Cache-Control: max-age 指令添加到对象

CloudFront 缓存

CloudFront 缓存指Cache-Control: max-age令值或 CloudFront 最大 TTL 值中较小值的对象。

浏览器缓存

浏览器缓存对象的时间长度为 Cache-Control: max-age 指令的值。

CloudFront 缓存

CloudFront 缓存取决于最 CloudFront 小 TTL 和最大 TTL 的值以及指Cache-Control max-age令:

  • 如果最小 TTL max-age < 最大 TTL,则 CloudFront 缓存对象以获取指令的值。Cache-Control: max-age

  • 如果 max-age < 最小 TTL,则 CloudFront缓存对象以获取 CloudFront 最小 TTL 的值。

  • 如果 max-age > 最大 TTL,则 CloudFront缓存对象以获取最 CloudFront 大 TTL 的值。

浏览器缓存

浏览器缓存对象的时间长度为 Cache-Control: max-age 指令的值。

源不会将 Cache-Control: max-age 指令添加到对象

CloudFront 缓存

CloudFront 将对象缓存为 CloudFront 默认 TTL 的值。

浏览器缓存

视浏览器而定。

CloudFront 缓存

CloudFront 缓存最小 TTL 值或默认 TTL CloudFront 值中较大值的对象。

浏览器缓存

视浏览器而定。

源将 Cache-Control: max-ageCache-Control: s-maxage 指令添加到对象

CloudFront 缓存

CloudFront 缓存指Cache-Control: s-maxage令值或 CloudFront 最大 TTL 值中较小值的对象。

浏览器缓存

浏览器缓存对象的时间长度为 Cache-Control max-age 指令的值。

CloudFront 缓存

CloudFront 缓存取决于最 CloudFront 小 TTL 和最大 TTL 的值以及指Cache-Control: s-maxage令:

  • 如果最小 TTL s-maxage < 最大 TTL,则 CloudFront 缓存对象以获取指令的值。Cache-Control: s-maxage

  • 如果 s-maxage < 最小 TTL,则 CloudFront缓存对象以获取 CloudFront 最小 TTL 的值。

  • 如果 s-maxage > 最大 TTL,则 CloudFront缓存对象以获取最 CloudFront 大 TTL 的值。

浏览器缓存

浏览器缓存对象的时间长度为 Cache-Control: max-age 指令的值。

源将 Expires 标头添加到对象

CloudFront 缓存

CloudFront 缓存对象直到Expires标题中的日期或 CloudFront 最大 TTL 的值(以较早者为准)。

浏览器缓存

浏览器缓存对象,直至 Expires 标头中的日期。

CloudFront 缓存

CloudFront 缓存取决于最 CloudFront 小 TTL 和最大 TTL 的值以及标Expires头:

  • 如果最小 TTL Expires < 最大 TTL,则 CloudFront 缓存对象直到标题中的日期和时间。Expires

  • 如果 Expires < 最小 TTL,则 CloudFront缓存对象以获取 CloudFront 最小 TTL 的值。

  • 如果 Expires > 最大 TTL,则 CloudFront缓存对象以获取最 CloudFront 大 TTL 的值。

浏览器缓存

浏览器缓存对象,直至 Expires 标头中的日期和时间。

源将 Cache-Control: no-cacheno-store 和/或 private 指令添加到对象

CloudFront 而且浏览器会尊重标题。

CloudFront 缓存

CloudFront 将对象缓存为最 CloudFront 小 TTL 的值。请参阅此表下面的警告。

浏览器缓存

浏览器以标头为准。

警告

如果从源端 CloudFront 获取了一个包含Cache-Control: no-cacheno-store、和/或private指令的对象,然后又 CloudFront 收到另一个查看者对同一对象的请求,则会 CloudFront 尝试联系来源以满足查看者的请求。

如果原点可以到达,则从原点 CloudFront 获取对象并将其返回给查看者。

如果原点无法到达,并且最小最大 TTL 值大于 0,则 CloudFront 将为之前从原点获得的对象提供服务。

为了避免该行为,请将 Cache-Control: stale-if-error=0 指令包含在从源返回的对象中。如果无法访问源,则这会导致 CloudFront 在响应 future 请求时返回错误,而不是返回之前从源中获得的对象。

有关如何使用 CloudFront 控制台更改分配设置的信息,请参阅更新分配。有关如何使用 CloudFront API 更改分配设置的信息,请参阅UpdateDistribution

使用 Amazon S3 控制台向对象添加标头

使用 Amazon S3 控制台向 Amazon S3 对象添加 Cache-ControlExpires 标头字段
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在存储桶列表中,选择包含要向其中添加标头的文件的存储桶的名称。

  3. 选中要向其中添加标头的文件或文件夹名称旁边的复选框。将标头添加到文件夹时,它会影响该文件夹内的所有文件。

  4. 选择 Actions(操作),然后选择 Edit metadata(编辑元数据)。

  5. Add metadata(添加元数据)面板中,执行以下操作:

    1. 选择 Add metadata(添加元数据)。

    2. 对于 Type(类型),选择 System defined(系统定义)。

    3. 对于 Key(键),选择要添加的标头的名称(Cache-ControlExpires)。

    4. 对于 Value(值),输入标头值。例如,对于 Cache-Control 标头,您可以输入 max-age=86400。对于 Expires,您可以输入到期日期和时间,如 Wed, 30 Jun 2021 09:28:00 GMT

  6. 在页面底部,选择 Edit metadata(编辑元数据)。