在Cache-control中,no-cache和no-store有什么区别?

86

我不知道Cache-Control:no-storeCache-Control:no-cache之间的实际区别。

据我所知,no-store表示不允许缓存设备缓存该响应。另一方面,no-cache表示不允许缓存设备在未先验证来源后提供已缓存的响应。但是这个验证是关于什么的?条件get吗?

如果一个响应具有no-cache,但没有Last-ModifiedETag怎么办?

谢谢。

4个回答

137

1
什么是可以被中间缓存缓存的意思? - test_124
我认为像CDN和所有服务这样的服务 - Asim K T
我创建了这个决策树的更新版本,请查看 https://stackoverflow.com/a/49925190/3748498 - pravdomil
根据视频,@ShashankGaurav的意思是CDN。 - Bartosz Popiela

30

但这个检查是关于什么的?

确切地说,它检查Last-ModifiedETag。客户端使用这些头部信息询问服务器是否有新版本的数据,如果答案是否定的,就会提供缓存数据。


更新

来自RFC

no-cache
    If the no-cache directive does not specify a field-name, then a cache MUST NOT use
 the response to satisfy a subsequent request without successful revalidation with the
 origin server. This allows an origin server to prevent caching even by caches that   
 have been configured to return stale responses to client requests. 

如果缓存响应没有Last-ModifiedETag怎么办? - vtortola
我认为在这种情况下,响应根本不会被缓存。 - Alex Gitelman
这就是我解释RFC的方式。(附加片段) - Alex Gitelman
1
请您更新报价以与此问题中的文本正确对齐,这有助于验证您所回应的内容。 - brennvo

22
正如您所指出的那样,no-cache并不意味着永远不进行缓存,而是用户代理必须始终询问服务器是否可以使用其缓存。相比之下,no-store表示甚至不要保留副本,这意味着没有什么可问的了。如果您知道“我可以重用这个吗?”的答案总是“不可以”,则通过跳过缓存验证并为其他数据节省缓存空间来获得性能提升。
除了性能之外,还有一个与浏览器历史记录相关的行为差异。HTTP 1.1第13.13节指出,“过期时间不适用于历史机制。” no-cache标头描述了过期,因此不适用于诸如后退按钮之类的历史机制。因此,用户可以在没有与服务器联系的情况下向后导航到先前的页面。
另一方面,no-store标头可以防止数据在会话外被存储,如果是这种情况,它将无法用于历史机制。使用no-store,如果用户通过导航到另一个域然后返回来结束他的会话,则浏览器知道显示什么的唯一方法是再次从服务器获取初始页面。
这是一个关于此话题的Chromium问题如何区分的方法:

no-cache并不意味着“不要缓存这个”(那应该是no-store)。no-cache意味着在资源重新验证新鲜度之前,不要将其用于正常加载。历史导航不属于正常加载。


1
  • No-store:客户端不会进行任何缓存操作。
  • No-cache:客户端将缓存响应,但在使用缓存数据之前,客户端将通过“ If-Modified-Since”或“ If-None-Match”头检查服务器是否更改了数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接