HTTP中缓存控制标头的最大值

Cas*_*ynn 69 caching http cache-control http-headers

我正在使用Amazon S3为我的网站提供静态资产.我想让浏览器尽可能长时间地缓存这些资产.我应该在资产中包含哪些元数据标头

Cache-Control: max-age=???
Run Code Online (Sandbox Code Playgroud)

mah*_*off 98

通常建议将一年作为标准最大值.请参阅RFC 2616:

要将响应标记为"永不过期",源服务器会在发送响应大约一年后发送过期日期.HTTP/1.1服务器不应该在将来发送超过一年的过期日期.

虽然这适用于较旧的expires标准,但cache-control在没有任何明确的标准指导的情况下适用也是有意义的.只要您通常需要,并且选择任意更长的值可能会破坏一些用户代理.所以:

Cache-Control: max-age=31536000
Run Code Online (Sandbox Code Playgroud)


Geo*_*ath 22

考虑不要"尽可能长时间"存储它,而是尽可能长时间地合理安排.例如,您不太可能需要将其缓存超过10年......我是对的吗?

RFC在此处讨论了max-age:http: //www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

Eric Lawrence说,在IE9之前,Internet Explorer会将任何具有Cache-Control的资源视为陈旧:max-age值超过2147483648(2 ^ 31)秒,大约68年(http://blogs.msdn.com/b /ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx).

其他用户代理当然会有所不同,所以...尝试选择一个不太可能(而不是可能!)导致溢出的数字.最大年龄大于31536000(一年)没什么意义,非正式地认为这是一个合理的最大值.

  • 缓存控制:max-age = 31536000将缓存1年,这是最大推荐值. (11认同)
  • @Geoffrey:我觉得你对凯西的建设感到困惑.他只是说他会在版本更改时更改他在标记中引用的URL.这是大多数顶级网站使用的最佳做法. (2认同)

sun*_*100 5

创建最长 1 年缓存建议的人没有正确考虑。

首先,如果向访问者提供过时的缓存文件,那么为什么在 1 年后突然加载新版本会带来任何好处?如果一个文件有 1 年的 TTL,从功能的角度来看,这显然意味着该文件根本不打算更改。

那么为什么需要超过 1 年的时间呢?

1)为什么不呢?它没有任何目的告诉访问者浏览器“嘿,这个文件已经有 1 年了,检查它是否已更新可能是一个想法”。

2)CDN服务。大多数内容交付网络使用缓存头来决定从边缘服务器有效地提供文件多长时间。如果您对文件有 1 年的缓存控制权,它会在某个时候开始从源服务器重新请求未更改的文件,并且需要完全重新填充边缘缓存,从而导致客户端加载速度变慢,并且不必要呼唤原点。

最多 1 年有什么意义?哪些浏览器会因设置高于 31536000 的数量而窒息?

  • 1年是互联网时代的永恒。另外,如果您认真对待缓存,您将处理(除了缓存控制)最后修改和/或 etag 机制。因此,即使是一年后的那些重新请求也不会损害带宽(304 未修改) (3认同)
  • 哦,还有默认的浏览器缓存大小。任何缓存资产会在浏览器缓存中存活一年吗?我不知道。 (3认同)
  • 当您的图像从未更改(就像互联网上的大多数图像一样),并且当您不希望 CDN 从源头刷新文件(这毫无意义)时,1 年不是永恒的。至于 last-modified/etag,当然会在客户端和服务器之间发起请求和对话,只是为了找出我们已经知道的“是的,它仍然可以提供缓存文件”。您的论点基本上是“1 年是互联网上的永恒”,这对任何生产力都没有帮助。我在图像上设置了 10 年到期,这只是提供了更好的最终结果。 (2认同)
  • 我同意@suncat100 和 Eijah 的观点。只要数据没有状态,就可以将长期资产存储在 CDN 中。在许多业务用例中,许多资产的情况持续了一年多。 (2认同)