无缓存和必须重新验证之间的区别


179

从RFC 2616

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

无缓存

如果no-cache指令未指定字段名,则在未经原始服务器成功重新验证的情况下,缓存不得使用响应来满足后续请求。这样,即使已配置为将陈旧响应返回给客户端请求的缓存,原始服务器也可以防止缓存。

因此,它指示代理重新验证所有响应。

比较这个

必须重新验证

当在缓存接收到的响应中存在must-revalidate指令时,该缓存在过期之前将不能使用该条目来响应后续请求,而不必先通过原始服务器对其进行验证,则该缓存不得使用该条目

因此,它指示代理重新验证过时的响应。

特别是关于no-cache,这是用户代理实际,凭经验对待该指令的方式吗?

什么是点no-cache,如果有must-revalidatemax-age

看到这个评论:

http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/

无缓存

尽管此指令听起来像是在指示浏览器不要缓存页面,但还是有细微的差别。根据RFC,“ no-cache”指令告诉浏览器在从缓存中提供页面之前,应先与服务器进行验证。重新验证是一种精巧的技术,可让应用程序节省带宽。如果浏览器已缓存的页面未更改,则服务器仅向浏览器发出信号,并从缓存中显示该页面。因此,浏览器(至少在理论上至少)将页面存储在其缓存中,但仅在与服务器重新验证后才显示页面。实际上,IE和Firefox已经开始对待no-cache指令,就像它指示浏览器甚至不缓存页面一样。大约一年前,我们开始观察这种行为。

有人在这方面有更多官方的吗?

更新资料

服务器仅当且仅当未能验证表示中的请求可能导致错误操作(例如静默未执行的金融交易)时,才应使用must-revalidate指令。

到现在为止,我从来没有想过这件事。RFC表示不要轻易使用必须重新验证。问题是,对于Web服务,您必须持否定态度,并为未知的客户端应用程序假设最糟糕的情况。任何陈旧的资源都有可能引起问题。

我刚刚考虑过的其他东西,如果没有Last-Modified或ETag,浏览器只能再次获取整个资源。但是,使用ETags,我观察到Chrome似乎至少在每次请求时都会重新验证。这使得这两个指令毫无意义,或者至少命名不当,因为它们不能正确地重新验证,除非请求还包含其他标头,这些标头随后仍然导致“始终重新验证”。

我只想使最后一点更清楚。仅设置must-revalidate但不包含ETag或Last-Modified,代理就只能再次获取内容,因为它没有什么可发送到服务器进行比较。

但是,我的经验测试表明,当响应中包含ETag或修改后的标头数据时,无论must-revalidate标头是否存在,代理始终会重新进行验证。

所以点must-revalidate是强制“旁路缓存”时,它会过时,如果当您设置了一生/年龄这只能发生,从而must-revalidate设置上,没有年龄或其他头的响应,它实际上就变成等同于no-cache自响应将立即被视为过期。

-因此,我将最终标记Gili的答案!


因此,从理论上讲,区别始终validate-alwaysvalidate-if-stale,而实际上,某些浏览器会像您引用的注释中所说的no -validate那样对待no-cache ……因此,您应该选择使用哪种缓存基于您实际上希望在实践中实现的缓存行为…
CBroe

请阅读 greenbytes.de/tech/webdav/… ,看看是否能为您弄清楚。
朱利安·雷施克


检查此决策树以获取答案stackoverflow.com/a/49925190/3748498
pravdomil

Answers:


191

我相信这must-revalidate意味着:

缓存过期后,即使用户说过时的响应是可接受的,也拒绝将过时的响应返回给用户。

鉴于no-cache

must-revalidate 加上响应立即变得过时的事实。

如果响应可缓存10秒钟,则must-revalidate在10秒钟后开始,而no-cache隐含must-revalidate在0秒钟后。

至少,这是我的解释。


2
那就是我现在所看到的。有趣的部分是我的最后一个段落,没有ETag或Last-Modified,代理没有什么可用来验证其在缓存中的内容,并且必须再次下载整个有效负载。因此,当RFC说“重新验证”时,可能意味着重新获取。
路加·普普利特

44
这也意味着max-age=0, must-revalidate并且no-cache相同
Anshul 2015年

5
@Anshul,起初我以为您认为“最大年龄= 0,必须重新验证和无缓存相同”是正确的,但是请参阅杰弗里·福克斯的回答,这似乎表明这不太正确。
唐·哈奇

2
@Anshul没有,must-revalidateno-cache有新鲜的反应不同的含义:如果一个缓存的响应是新鲜的(即响应尚未过期),must-revalidate将会使代理服务它马上不与服务器重新验证,而使用no-cache代理服务器必须重新验证缓存的响应,无论新鲜度如何。来源:“ HTTP-权威指南”,第182-183页。
马提亚斯·布劳恩

8
@MatthiasBraun啊,我可以看到混乱的根源。也许我应该写过no-cache并且max-age=0, must-revalidate是一样的
Anshul '17
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.