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

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

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

通常,CloudFront 从边缘站点提供文件,直至超出您指定的缓存时长,直至文件过期。文件过期后,边缘站点下次收到用户对文件的请求时,CloudFront 会将请求转发到来源服务器,以确认缓存包含文件的最新版本。来自源的响应取决于文件是否已更改:

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

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

如果边缘站点中的某个文件不常被请求,则 CloudFront 可能会移除该文件 – 在文件到期日之前删除文件,以便为最近常被请求的文件腾出空间。

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

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

您还可以控制在 CloudFront 将另一个请求转发到源以再次尝试获取请求的对象之前,在 CloudFront 缓存中保留错误(例如,404, Not Found)的时间。有关更多信息,请参阅 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-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 缓存对象的时间长度

要控制 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 如何处理 Cache-Control: no-cache 标头的例外情况,请参阅同一对象的并行请求 (流量高峰)

CloudFront 缓存

CloudFront 缓存对象的时间长度为 CloudFront 最短 TTL 值。请参阅此表下面的警告

浏览器缓存

浏览器以标头为准。

警告

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

如果源可以访问,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. 选择 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(编辑元数据)。