2011-08-15 45 views
45

我正在使用Amazon S3为我的网站提供静态资产。我希望浏览器尽可能长时间缓存这些资产。我应该包括我的资产HTTP中缓存控制标头的最大值

Cache-Control: max-age=??? 
+0

可能max-age的值是依赖于浏览器/版本,并在任何方式代理... AFAIK没有真正的标准/规范,这样任何值将是一个猜测... – Yahia

回答

63

通常建议一年为标准最大值。见RFC 2616

为了纪念一个响应为“永不过期”,源服务器发送一个 到期日期的大约一年,从回应是 发送的时间。 HTTP/1.1服务器不应该在将来发送超过一个 年的过期日期。

虽然适用于旧expires标准,是有意义的申请cache-control太在没有任何明确的标准指导。无论如何,只要您通常需要,随意选择任意长度的值可能会破坏某些用户代理。所以:

Cache-Control: max-age=31536000 
16

哪些元数据报头考虑的不是将其存储为“只要有可能,”而是沉淀,只要是合理的。例如,你不太可能需要将它缓存超过10年的时间......我是对的吗?

的RFC这里讨论的max-age:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

埃里克·劳伦斯说,之前IE9,IE浏览器会当作过时的任何资源具有的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(一年)没有意义,非正式地说这被认为是合理的最大值。

+0

实际上,我在寻找特定的标题发送。我有内置到我的网站来更改文件的URL指向不同的文件名,如果我需要做出改变,并有游客看到它的机制。我只需要发送特定头文件的示例,让浏览器无限期地缓存这些资源。 –

+9

缓存控制:最大年龄= 31536000将其缓存为1年,这是最大推荐。 – EricLaw

+2

@Geoffrey:我觉得你无所适从凯西正在建设。他只是说当版本发生变化时他会更改他在标记中引用的URL。这是大多数顶级网站使用的最佳做法。 – EricLaw

1

谁创造最大1年缓存的建议,没想到它通过适当的人。

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

那么为什么会需要超过1年?

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

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

最长1年的要点是什么?哪些浏览器在设置的金额高于31536000时会窒息?

+3

1年是互联网时代的永恒。另外,如果你需要缓存认真你会处理(除高速缓存控制)的最后一次修改和/或ETAG机制。因此即使是一年后的重新请求也不会损害带宽(304未修改) – redben

+0

1年不是永恒的,当你的图像永远不会改变(像互联网上的大多数图像),并且当你不想要一个CDN从原点刷新文件(这是毫无意义的)。至于最后修改的/ etag,当然这会启动客户端和服务器之间的请求和对话,只是为了找出我们已经知道的“yup,它仍然可以提供缓存的文件”。你的论点基本上是“1年是互联网上的永恒”,它不会提供任何有用的东西。我已经在图像上设置了10年到期,这只是一个更好的最终结果。 – suncat100

+3

哦,还有默认的浏览器缓存大小。任何缓存的资产是否会在浏览器缓存中存活一年?我不知道。 – redben