浏览器是否没有正确遵循HTTP规范的缓存控制?



我对web开发有些陌生,并注意到一个问题,浏览器似乎不尊重Cache Control标头,我将其设置为no-cache, no-store, must-revalidate,但我的许多客户端都有一个缓存(根据https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#no-存储(,并且当我更改页面中引用的JS脚本时,使用缓存而不是与服务器重新验证导致页面破裂,只有在我告诉他们在没有缓存的情况下刷新后,浏览器才会获取新文件,但浏览器要符合HTTP协议和规范,它们是否需要遵守no-store策略,或者没有一个主要的浏览器正确地符合HTTP协议/规范,为什么它们没有被修复,这样我们就不需要变通的解决方案,比如附加到文件中的查询字符串,或者使用文件的哈希或最后修改日期?

您最初提供的资源没有缓存头。在这种情况下,规范允许客户端自己选择缓存时间:

由于源服务器并不总是提供明确的过期时间,当显式时间为未指定,使用使用其他标头字段的算法值(例如Last-Modified时间(来估计过期时间。

不同的浏览器会使用不同的算法,但无论如何,这可能不会很长。你的问题可能已经自行解决了。

至于查询字符串,我认为您的困惑来自于将至少三个不同的问题混为一谈。一种是用于通信缓存策略的HTTP协议机制。这在RFC 7234中有介绍,主要涉及Cache-Control响应标头的正确使用。

另一个问题是使用什么缓存策略。也就是说,应该缓存哪些资源以及缓存多长时间?有不同的方法可以解决这个问题,我的建议是遵循这里讨论的最佳实践。

最后,如果您传达了错误的缓存策略,并且现在需要忽略或无效已经缓存的资源,那么如何修复您的错误。在这种情况下,如果可能的话,您可以使用不同的资源(即更改名称(。这里有时建议添加查询字符串,但这不是一个很好的解决方案,因为标准并没有禁止客户端使用查询字符串缓存资源。

回到您的问题,您可以通过更改链接资源的名称,或只是等待一小段时间等待启发式过期时间来暂时纠正您的错误(缺少Cache-Control标头(。从长远来看,您应该决定如何缓存不同的资源,然后使用Cache-Control将此意图传达给浏览器。

最新更新