浏览器是否没有正确遵循 HTTP 规范的 Cache-Control?

Do browsers not follow the HTTP spec's Cache-Control correctly?

我是网络开发的新手,注意到一个问题,浏览器似乎不尊重 Cache-Control header,我将其设置为 no-cache, no-store, must-revalidate 但我的许多客户端有一个缓存开始(根据 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#no-store,no-store 应该阻止)并且当我更改页面中引用的 JS 脚本时,使用缓存而不是与服务器重新验证导致页面损坏,只有在我告诉他们在没有缓存的情况下刷新之后,浏览器才会获取新文件但是为了使浏览器符合 HTTP 协议和规范,他们不需要遵守 no-store 政策还是 none 的主要浏览器正确地兼容 HTTP protocol/spec,为什么它们没有被修复,所以我们不需要变通解决方案,如附加到文件的查询字符串或使用文件的哈希或最后修改日期?

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

Since origin servers do not always provide explicit expiration times, a cache MAY assign a heuristic expiration time when an explicit time is not specified, employing algorithms that use other header field values (such as the Last-Modified time) to estimate a plausible expiration time.

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

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

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

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

回到您的问题,您可以通过更改链接资源的名称或稍等片刻启发式来暂时修复您的错误(缺少 Cache-Control headers)到期时间过去。从长远来看,您应该决定如何缓存不同的资源,然后使用 Cache-Control 将该意图传达给浏览器。