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

问题描述 投票:17回答:10

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

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

如果我的代码从获取/r20/example.js变为/r21/example.js,我可以确定example.js的修订版20已被缓存,但现在修订版21已经取而代之而且它现在被缓存了吗?

javascript url browser caching filenames
10个回答
37
投票

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

更新:

this ThinkVitamin article声称Opera和Safari / Webkit浏览器不使用?query = strings缓存URL是错误的。

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

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

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

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


-1
投票

要看。它应该是完整的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


3
投票

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

来自HTTP 1.1 specification的相关摘录:

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

来自URI specification的相关摘录:

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

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

hier-part   = "//" authority path-abempty
              / path-absolute
              / path-rootless
              / path-empty

2
投票

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


1
投票

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

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

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


0
投票

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


0
投票

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


0
投票

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


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.