no-cache和must-revalidate之间的区别
来自RFC 2616
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1
无caching
如果no-cache指令没有指定一个字段名,那么caching不能使用响应来满足后续的请求,而不需要对源服务器进行成功的重新validation。 这允许源服务器甚至通过已configuration为对客户端请求返回陈旧响应的高速caching来防止高速caching。
所以它指示代理重新validation所有的响应。
比较这个
必重新validation
当高速caching接收到的响应中存在must-revalidate指令时,该高速caching不应该在该条目失效之后才使用该条目来响应后续请求,而不必先用源服务器对其进行重新validation
所以它指示代理重新validation陈旧的响应。
特别是关于no-cache
,这个用户代理实际上是如何处理这个指令的?
如果must-revalidate
和max-age
那么no-cache
有什么意义?
看到这个评论:
http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/
无caching
虽然这个指令听起来像是指示浏览器不要caching页面,但有一个细微的差别。 根据RFC,“no-cache”指令告诉浏览器在从caching中提供页面之前,应该对服务器进行重新validation。 重新validation是一种简洁的技术,可以让应用程序节省带宽。 如果浏览器已经caching的页面没有改变,那么服务器只是向浏览器发出信号并且从caching中显示该页面。 因此,浏览器(至less在理论上)将页面存储在caching中,但只有在服务器重新validation后才显示。 实际上,IE和Firefox已经开始将no-cache指令视为指示浏览器不要caching页面。 大约一年前我们开始观察这种行为。 我们怀疑这种改变是由于广泛使用这个指令来防止caching。
有没有人有更多的官方呢?
更新
必须重新validation的指令应当被服务器使用,当且仅当在表示上validation请求的失败可能导致不正确的操作,比如默默无闻的财务事务。
这是我迄今为止从未想过的事情。 RFC是说不要轻易使用必须重新validation。 问题是,使用Web服务,你必须采取消极的看法,并假设你的未知的客户端应用程序最糟糕的。 任何陈旧的资源都有可能导致问题。
还有一些我刚刚考虑过的,没有Last-Modified或ETags,浏览器只能再次获取整个资源。 然而,对于ETags,我发现至lessChrome似乎对每个请求都进行了重新validation。 这使得这两个指令都是无效的,或者至less命名不当,因为它们无法正确地重新validation,除非请求中还包含其他头文件,这些头文件总是会导致“始终重新生效”。
我只是想让最后一点更清楚。 通过设置must-revalidate
但不包括ETag或Last-Modified,代理程序只能再次获取内容,因为它没有任何内容要发送到服务器进行比较。
但是,我的经验性testing表明,当ETag或修改的头数据包含在响应中时,无论如何不pipemust-revalidate
头,都始终重新validation代理。
因此, must-revalidate
的一点是,当过期时,强制使用“旁路caching”,只有当您设置了生命周期/年龄时才会发生这种情况,因此,如果在没有年龄或其他标头的响应中设置了must-revalidate
,它实际上等价于no-cache
因为响应将立即被认为是陈旧的。
所以我最终要标记吉利的答案
我认为must-revalidate
意思是“一旦caching过期,即使他们说过时的响应可以接受,也拒绝向用户返回陈旧的响应”。 而no-cache
意味着must-revalidate
加上事实响应变得陈旧。
如果响应可caching10秒,则10秒后must-revalidate
,而no-cache
暗示0秒后must-revalidate
。
至less,这是我的解释。
max-age=0, must-revalidate
和no-cache
不完全相同。 must-revalidate
,如果服务器不响应重新validation请求,浏览器/代理应该返回一个504错误。 在no-cache
,它只会显示caching的内容,这可能会被用户所喜欢(最好是没有什么陈旧的东西)。 这就是为什么must-revalidate
仅用于关键事务。
在Jeffrey Fox对no-cache
的解释中,我已经在chrome 52.0.2743.116 m下进行了testing,结果表明no-cache
与must-revalidate
具有相同的行为,当服务器不可用时,它们都不会使用本地caching,当服务器不可用时,他们都会使用caching,同时点击浏览器的后退/前进button。 如上所述,我认为max-age=0, must-revalidate
至less在实现中max-age=0, must-revalidate
与no-cache
完全相同。