适用于不同类型资源的理想HTTP缓存控制标头


82

我想找到一组最小的标头集,这些标头可以与“所有”缓存和浏览器一起使用(也在使用HTTPS时使用!)

在我的网站上,我将拥有三种资源:

(1)永久可缓存(公开/对所有用户均等)

示例:0A470E87CC58EE133616F402B5DDFE1C.cache.html(由GWT自动生成

  • 这些文件在更改内容时(基于MD5)会自动分配一个新名称。

  • 即使使用HTTPS,也应该尽可能地对其进行缓存(因此,我认为应该设置Cache-Control: public,尤其是对于Firefox?)

  • 如果内容已更改,他们不应该要求客户端往返服务器进行验证。

(2)偶尔更改(公开/对所有用户均等)

示例:index.html,mymodule.nocache.js

  • 部署新版本的网站时,这些文件将更改其内容而不会更改URL。

  • 它们可以被缓存,但是可能每次都需要往返来重新验证。

(3)每个请求的个人(私人/用户特定)

示例:JSON响应

  • 在任何情况下,都不应将这些资源未加密地缓存到磁盘中。(除非我可能会缓存一些特定的请求。)

我对每种类型可能使用的标头有一个大致的了解,但是总会缺少一些东西。


感谢您的回答,评论和链接。我仍在尝试,但我想我将能够得出解决方案!
克里斯·勒彻

2
通常无法实现#3。
EricLaw 2011年

Answers:


90

我可能会使用以下设置:

  1. Cache-Control: max-age=31556926–表示可以被任何高速缓存所高速缓存。缓存的表示形式将被视为一年新鲜:

    为了将响应标记为“永不过期”,源服务器会从响应发送时间起大约一年后发送一个 Expires日期。HTTP / 1.1服务器不应发送超过一年的过期日期。

  2. Cache-Control: no-cache–任何缓存都允许缓存表示。但是缓存必须在释放缓存副本之前将请求提交给原始服务器以进行验证。
  3. Cache-Control: no-store –缓存在任何情况下均不得缓存表示。

有关更多信息,请参见Mark Nottingham的缓存教程


1
@Gumbo:有一点我敢肯定的是,我需要一套公众,当我想Firefox 3或公共文件缓存到磁盘,而使用HTTPS:stackoverflow.com/questions/174348/...
克里斯Lercher

2
某些浏览器(例如IE)已开始将Cache-Control:no-cache视为无存储。诚然,这不是根据RFC进行的,但是已知这样做是为了“修复”许多人使用无缓存来防止敏感数据未经加密存储在磁盘上所犯的错误。
AviD 2010年

1
@chris_l,我通过此链接发生了:palisade.plynt.com/issues/2008Jul/cache-control-attributes。我不记得以前的版本是如何表现的,尽管我认为IE7也是这样做的。
AviD 2010年

2
同样,Firefox不再需要Cache-Control中的PUBLIC来缓存HTTPS资源。但是总的来说,最好的选择是在观看流量的同时测试您的网站,例如使用Fiddler。
EricLaw 2011年

3
建议不要将缓存控制值设置为100年。首先,该规范建议最长为1年。其次,任何价值超过68年效果评价中立即到期,为IE8及以下:blogs.msdn.com/b/ieinternals/archive/2010/01/26/...
EricLaw

-2

案例一和案例二实际上是同一场景。您应该设置Cache-Control: public然后生成一个URL,其中包含站点的内部版本号/版本,以便您拥有不可变的资源,这些资源可能永远存在。您还希望Expires在未来一年或更长时间设置标头,以便客户端无需发出新鲜度检查。

对于情况3,您可以执行以下所有操作以获得最大的灵活性:

"Cache-Control", "no-cache, must-revalidate"
"Expires", 0
"Pragma", "no-cache"

新构建的不同URL可能不是一个选择:a)这将迫使客户端重新下载永久可缓存的文件。他们使用唯一的名称来避免这种情况。b)我站点的主要URL应该只是https://www.example.com/c)我希望书签始终引用我站点的最新版本(想象一下,stackoverflow问题的书签将包含站点的内部版本号)。
克里斯·勒彻

克里斯,您好:这种方法通常用于CSS和JS资源,而不是文档。我同意它不适用于文档标识符,在这种情况下,您只需在标头上设置缓存控制公共,Last-Modified和etag,这将每次导致一次新鲜度检查,如果没有更改,则只会发送304自上次下载以来。或者,您可以通过JS在每个页面中下载实际的动态页面内容,因此您在保留URL的同时仍然允许有效的缓存。
安德鲁L

是的,这几乎就是这样,GWT可以为我处理:我的index.html(偶尔更改)包括mymodule.nocache.js(偶尔更改),该模块自动包含正确的永久可缓存文件(大部分JS,GWT管理)图片包,...)给我的唯一一件事就是为每种类型设置正确的http标头。我想将这些标题减少到最小,因为它们占传输量的很大一部分。那么我是否需要例如Last-ModifiedETag等?
克里斯·勒彻

实际上,“ Expires”必须是日期,而不是数字0。它的值应与“ Date”标题相同。参见mnot.net/cache_docs
Luke Hutchison
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.