27

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

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

如果我的代码从 fetching 更改/r20/example.js/r21/example.js,我是否可以确定修订版 20 已example.js被缓存,但现在修订版 21 已被获取并且现在已缓存?

4

10 回答 10

51

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

更新:

这篇 ThinkVitamin 文章中声称 Opera 和 Safari/Webkit 浏览器不缓存带有 ?query=strings 的 URL的说法是false

将版本号参数添加到 URL 是一种完全可以接受的缓存清除方法。

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

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

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

于 2008-09-17T17:02:05.517 回答
6

浏览器缓存键是请求方法和资源 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
于 2017-01-18T09:55:18.267 回答
2

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

于 2008-09-17T14:46:23.703 回答
2

标识 HTTP 对象所需的最小值是完整路径,包括任何查询字符串参数。一些浏览器可能不会使用查询字符串缓存对象,但这与缓存的键无关。

同样重要的是要记住路径不再足够。HTTP 响应中的 Vary: 标头会提醒浏览器(或代理服务器等)除 URL 之外的任何其他内容,应用于确定缓存键,例如 cookie、编码值等。

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

于 2008-09-17T15:40:15.963 回答
0

依靠。它应该是完整的 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 之外。”</p>

http://www.thinkvitamin.com/features/webapps/serving-javascript-fast

于 2008-09-17T14:46:14.687 回答
0

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

于 2008-09-17T14:46:42.317 回答
0

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

于 2008-09-17T14:47:41.597 回答
0

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

于 2008-09-17T16:38:56.943 回答
0

除了现有的答案之外,我只想补充一点,如果您使用 ServiceWorkers 或例如离线插件,它可能不适用。然后,您可能会遇到不同的缓存规则,具体取决于 ServiceWorker 的设置方式。

于 2018-10-24T12:55:06.583 回答
-1

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

于 2008-09-17T14:52:04.283 回答