我发现Cache-Control:no-store
和Cache-Control:no-cache
之间没有实际区别。
据我所知,no-store
表示不允许缓存设备缓存该响应。另一方面,no-cache
表示不允许缓存设备提供缓存响应,而不首先使用源验证它。但那个验证是什么?条件得到?
如果回复有no-cache
但没有Last-Modified
或ETag
怎么办?
问候。
答案 0 :(得分:54)
有关更好的理解,请参阅下面的流程图
答案 1 :(得分:19)
但那是什么检查?
正确检查Last-Modified
或ETag
。客户端会询问服务器是否有使用这些标头的新版本数据,如果答案为否,它将提供缓存数据。
更新
来自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.
答案 2 :(得分:7)
正如您所指出的,no-cache并不意味着永远不会缓存,而是用户代理必须始终询问服务器是否可以使用缓存的内容。相比之下,没有商店说甚至不保留副本,这意味着没有什么可以问的。如果你知道答案“我可以重复使用吗?”永远不行,您可以通过跳过缓存验证并在缓存中为其他数据节省空间来提升性能。
除了效果之外,浏览器历史记录存在行为差异。 HTTP 1.1部分13.13表示“到期时间不适用于历史机制”。 no-cache标头描述了到期,因此不适用于历史机制,例如后退按钮。因此,用户可以在没有联系服务器的情况下向后导航到没有缓存的上一页。
另一方面,no-store标头阻止数据存储在会话之外,在这种情况下,它根本不可用于历史机制。如果用户没有存储,如果用户通过导航到另一个域结束其会话然后返回,则浏览器知道要显示的内容的唯一方法是从服务器再次获取初始页面。
以下是关于此主题的Chromium issue如何区分:
no-cache并不意味着“不要缓存此”(这将是无商店)。 no-cache意味着不要将此用于正常负载,除非为新鲜度重新验证资源。历史导航不是正常负载。