当根页面频繁失效时(例如新闻源),您通常更喜欢在缓存控制的响应标头中使用no-store
还是?据我所知,这样做的一个优点是,它甚至无需浏览器进行预检请求来确定本地版本是否过时。no-store 是否得到很好的支持?no-cache
no-store
答案1
这个糟糕的名字no-cache
并不意味着不缓存,而是实际上意味着“缓存,但不要在未检查其是否仍然有效的情况下使用”。它通常用于经常更改的非敏感页面 - 就像您举的报纸主页的例子一样。
而no-store
意味着“根本不缓存它”。它通常用于敏感页面(例如网上银行页面)。
最后,同样名字不好的,must revalidate max-age=XXXX
意思是“使用时无需重新验证,直到XXXX
几秒过去,然后在重新使用之前与服务器检查(即将其视为no-cache
)”。它用于可缓存的资源(无论是短时间、长时间还是介于两者之间的某个时间)。
据我所知 - [no-store] 甚至不需要浏览器进行预检请求来确定本地版本是否过时。
我认为你误解了这一点。这确实额外的飞行前请求。No-cache
对资源发出请求,但同时说“嘿,我已经有一个版本,请告诉我它是否仍然有效”。如果它仍然有效,它会得到一个较短的响应(304 未修改),如果它不再有效,它会得到完整的响应 - 就像它一样no-store
。所以没有额外的请求,只是no-cache
如果它没有改变,这可能会让你免于重新下载整个资源。这是一件好事,因为它为客户端和服务器节省了带宽。如果你已经拥有它,重新下载它是没有意义的。因此,对于非敏感页面,你应该始终no-cache
选择。no-store
无商店支持吗?
所有浏览器都支持所有这些。不过需要注意的是,浏览器经常会在某些导航中重复使用页面,这可能是意料之外的。因此,即使指定了 no-cache 或 no-store,返回也会重复使用页面,这确实会让人感到困惑。其他导航(例如转到另一个网站然后返回,或者只是访问链接或 URL)将要按预期引起服务器重新验证。