是用作浏览器缓存中的键的文件名还是整个 URL?
-
01-07-2019 - |
题
希望浏览器缓存资源是很常见的——JavaScript、CSS、图像等。直到有新版本可用,然后确保浏览器获取并缓存新版本。
一种解决方案是在资源的文件名中嵌入版本号,但是将要以这种方式管理的资源放在带有修订号的目录中会起到同样的作用吗?文件的整个 URL 是否用作浏览器缓存中的键,或者只是文件名本身和一些元数据?
如果我的代码因获取而发生变化 /r20/example.js
到 /r21/example.js
, ,我可以确定修订版 20 example.js
已缓存,但现在已获取修订版 21 并且现在已缓存?
解决方案
是的,任何改变 任何部分 URL 的内容(不包括 HTTP 和 HTTPS 协议更改)被浏览器(以及任何中间代理)解释为不同的资源,因此将在浏览器缓存中产生单独的实体。
更新:
索赔于 这篇 ThinkVitamin 文章 Opera 和 Safari/Webkit 浏览器不缓存带有 ?query=strings 的 URL 是 错误的.
在 URL 中添加版本号参数是一种完全可以接受的缓存清除方法。
可能让 ThinkVitamin 文章的作者感到困惑的是,在 Safari 和 Opera 中的地址/位置栏中按 Enter 键会导致包含查询字符串的 URL 出现不同的行为。
然而, (这是重要的部分!) 歌剧和野生动物园 行为就像 IE 和 Firefox 当涉及到网页中的嵌入式/链接图像和样式表和脚本时,无论它们是否具有“?”他们的网址中的字符。(这可以通过在普通 Apache 服务器上进行简单测试来验证。)
(如果我有这样做的声誉,我会对当前接受的答案发表评论。:-)
其他提示
浏览器缓存键是请求方法和资源 URI 的组合。URI 由方案、权限、路径、查询和片段组成。
相关摘录自 HTTP 1.1 规范:
主缓存键由请求方法和目标 URI 组成。但是,由于当今常见使用的HTTP缓存通常仅限于缓存响应,因此许多缓存只是拒绝其他方法,而仅将URI用作主要缓存键。
相关摘录自 URI规范:
通用的URI语法由所谓的组件的层次序列组成,称为方案,权威,路径,查询和片段。
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
我 99.99999% 确信它是用于在浏览器中缓存资源的整个 url,因此您的 url 方案应该可以正常工作。
识别 HTTP 对象至少需要通过完整路径,包括任何查询字符串参数。某些浏览器可能不会缓存带有查询字符串的对象,但这与缓存的键无关。
同样重要的是要记住,路径不再足够了。变化:HTTP 响应中的 header 会向浏览器(或代理服务器等)发出除 URL 以外的任何内容的警告,这些内容应用于确定缓存密钥,例如 cookie、编码值等。
对于您的基本问题,是的,更改 .js 文件的 URL 就足够了。对于决定缓存键的更大问题,它是 URL 加上 Vary:标头限制。
是的。从缓存的角度来看,不同的路径是相同的。
当然,它必须使用整个路径“/r20/example.js”与“/r21/example.js”可能是完全不同的图像。您建议的是处理版本控制的可行方法。
在大多数浏览器中使用完整的 url。在某些浏览器中,如果您在 url 中进行查询,则该文档将永远不会被缓存。
整个网址。我在一些较旧的浏览器中看到了一种奇怪的行为,其中区分大小写发挥了作用。
除了现有的答案之外,我只想补充一点,如果您使用 ServiceWorkers 或例如离线插件,它可能不适用。然后,您可能会遇到不同的缓存规则,具体取决于 ServiceWorkers 的设置方式。
依靠。它应该是完整的 URL,但某些浏览器(Opera、Safari2) 对具有不同参数的 url 应用不同的缓存策略。
最好的办法是更改文件名.
这里有一个非常聪明的解决方案(使用 PHP、Apache)
http://verens.com/archives/2008/04/09/javascript-cache-problem-solved/
策略说明:“根据 HTTP 缓存规范的规定,用户代理永远不应该缓存带有查询字符串的 URL。虽然 Internet Explorer 和 Firefox 会忽略这一点,但 Opera 和 Safari 不会 - 为了确保所有用户代理都可以缓存您的资源,我们需要将查询字符串保留在其 URL 之外。”
http://www.thinkvitamin.com/features/webapps/serving-javascript-fast