它是用作浏览器缓存中的密钥的文件名或整个URL吗?

javascript url browser caching filenames

10008 观看

10回复

7414 作者的声誉

通常希望浏览器缓存资源 - JavaScript,CSS,图像等,直到有新版本可用,然后确保浏览器取代并缓存新版本。

一种解决方案是在资源的文件名中嵌入一个版本号,但是将以这种方式管理的资源放在一个带有修订号的目录中也可以做同样的事情吗?该文件的整个URL是否用作浏览器缓存中的密钥,还是仅仅是文件名本身和一些元数据?

如果从获取我的代码更改/r20/example.js/r21/example.js,我可以肯定的是修订20 example.js被缓存,但现在修订21已经不是获取它,这就是缓存?

作者: Richard Turner 的来源 发布者: 2008 年 9 月 17 日

回应 10


-1

48507 作者的声誉

要看。它应该是完整的URL,但是某些浏览器(Opera,Safari 2)对具有不同参数的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

作者: scunliffe 发布者: 2008 年 9 月 17 日

2

1561 作者的声誉

我99.99999%确定它是用于在浏览器中缓存资源的整个URL,因此您的url方案应该可以正常工作。

作者: delux247 发布者: 2008 年 9 月 17 日

0

16187 作者的声誉

是。从缓存角度来看,不同的路径是相同的。

作者: noah 发布者: 2008 年 9 月 17 日

0

95387 作者的声誉

当然它必须使用整个路径'/r20/example.js'与'/r21/example.js'可能是完全不同的图像开始。你建议的是一种处理版本控制的可行方法。

作者: Diodeus - James MacFarlane 发布者: 2008 年 9 月 17 日

0

2379 作者的声誉

在大多数浏览器中,使用完整的URL。在某些浏览器中,如果您在网址中有查询,则永远不会缓存该文档。

作者: Alexandre Victoor 发布者: 2008 年 9 月 17 日

1

4170 作者的声誉

您需要识别HTTP对象的MINIMUM是完整路径,包括任何查询字符串参数。某些浏览器可能不会使用查询字符串缓存对象,但这与缓存的密钥无关。

记住路径不再足够也很重要。HTTP响应中的Vary:标头向浏览器(或代理服务器等)发出除应该用于确定缓存密钥的URL以外的任何内容的警报,例如cookie,编码值等。

对于您的基本问题,是的,更改.js文件的URL就足够了。对于决定缓存密钥的更大问题,它是URL加上Vary:头限制。

作者: Michael Cramer 发布者: 2008 年 9 月 17 日

0

131 作者的声誉

整个网址。我在一些旧的浏览器中看到了一种奇怪的行为,其中区分大小写起了作用。

作者: user16169 发布者: 2008 年 9 月 17 日

35

11820 作者的声誉

决定

是的,URL的任何部分的任何更改(不包括HTTP和HTTPS协议更改)都会被浏览器(以及任何中间代理)解释为不同的资源,因此将导致浏览器缓存中的单独实体。

更新:

这篇ThinkVitamin文章中,Opera和Safari / Webkit浏览器不使用?query = strings缓存URL 的说法是错误的

向URL添加版本号参数是执行缓存清除的完全可接受的方法。

可能让ThinkVitamin文章的作者感到困惑的是,在Safari和Opera中的地址/位置栏中按Enter键会导致其中包含查询字符串的URL的行为不同。

然而,(这是重要的部分!)Opera和Safari 在网页中缓存嵌入/链接图像和样式表和脚本时的行为就像IE和Firefox一样 - 无论它们是否具有“?” 他们的网址中的字符。(这可以通过普通Apache服务器上的简单测试来验证。)

(如果我有声誉的话,我会评论目前接受的答案。:-)

作者: Már Örlygsson 发布者: 2008 年 9 月 17 日

2

7529 作者的声誉

浏览器缓存键是请求方法和资源URI的组合。URI由方案,权限,路径,查询和片段组成。

HTTP 1.1规范的相关摘录:

主缓存密钥由请求方法和目标URI组成。但是,由于目前常用的HTTP缓存通常仅限于缓存对GET的响应,因此许多缓存只是拒绝其他方法并仅使用URI作为主缓存密钥。

URI规范的相关摘录:

通用URI语法由分层的组件序列组成,称为方案,权限,路径,查询和片段。

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part   = "//" authority path-abempty
              / path-absolute
              / path-rootless
              / path-empty
作者: Leonid Vasilev 发布者: 2017 年 1 月 18 日

0

45 作者的声誉

除了现有的答案,我只想补充说,如果您使用ServiceWorkers或者例如offline-plugin,它可能不适用。然后,您可以体验不同的缓存规则,具体取决于ServiceWorkers的设置方式。

作者: activist 发布者: 2018 年 10 月 24 日
32x32