管理内容保留在缓存中的时间长度(过期) - 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 小时后自动过期,但您可以通过以下两种方式来更改默认行为:

  • 要更改所有匹配相同路径模式的文件的缓存持续时间,可以更改缓存行为的最小 TTL最大 TTL默认 TTL 的 CloudFront 设置。有关各个设置的信息,请参阅 分配设置参考 中的最小 TTL最大 TTL默认 TTL

  • 要更改单个文件的缓存持续时间,您可以配置源以向文件中添加 Cache-Control 标头以及 max-ages-maxage 指令或者添加 Expires 标头。有关更多信息,请参阅 使用标头控制单独对象的缓存时间长度

有关最小 TTL默认 TTL最大 TTL 如何与 max-ages-maxage 指令以及 Expires 标头字段交互的更多信息,请参阅指定 CloudFront 缓存对象的时间长度

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

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

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

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

    Cache-Control: max-age=

    例如,以下指令告诉 CloudFront 在缓存中将相关对象保留 3600 秒(一小时):

    Cache-Control: max-age=3600

    如果您希望对象在 CloudFront 边缘缓存中保留的时间不同于在浏览器缓存中的保留时间,可以将 Cache-Control max-ageCache-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 缓存对象的时间长度

您不能使用查看器的 Cache-Control 请求中的 HTTP PragmaGET 标头字段来强制 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
    注意

    CloudFront 提供过期内容的时间最长可达 stale-while-revalidate 指令的值或 CloudFront 最大 TTL 的值,以较小者为准。

  • stale-if-error 指令允许 CloudFront 在源不可访问或源返回介于 500 和 600 之间的错误代码时从缓存中提供过时内容。这可确保查看器即使在源中断期间也可以访问内容。

    在以下示例中,CloudFront 将响应缓存一个小时(max-age=3600)。如果源在此时间段后断开或返回错误,CloudFront 将在长达 24 小时(stale-if-error=86400)内继续提供过时内容。

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

    CloudFront 提供过期内容的时间最长可达 stale-if-error 指令的值或 CloudFront 最大 TTL 的值,以较小者为准。

    当配置了 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 缓存对象的时间长度为 CloudFront 最小 TTL 或默认 TTL(以较大的值为准)。

浏览器缓存

视浏览器而定。

源将 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 值。请参阅此表下面的警告。

浏览器缓存

浏览器以标头为准。

警告

如果您的最小 TTL 大于 0,CloudFront 将使用缓存策略的最小 TTL,即使源标头中存在 Cache-Control: no-cacheno-store 和/或 private 指令。

如果源可以访问,CloudFront 会从源获取对象并将其返回给查看器。

如果源无法访问并且最小 最大 TTL 值大于 0,CloudFront 将提供其先前从源获取的对象。

为了避免该行为,请将 Cache-Control: stale-if-error=0 指令包含在从源返回的对象中。这样一来,如果源无法访问,以后 CloudFront 就会返回错误消息,作为对请求的响应,而不是返回其先前从源获取的对象。

有关如何使用 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. 选择操作,然后选择编辑元数据

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

    1. 选择添加元数据

    2. 对于类型,选择系统定义

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

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

  6. 在页面底部,选择编辑元数据