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

Ric*_*ner 19 javascript browser url filenames caching

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

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

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

Már*_*son 39

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

更新:

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

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

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

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

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

  • 我无法想象浏览器、mozilla、netscape 等历史上的任何缓存在派生缓存密钥时都会忽略查询字符串。查询字符串的全部目的始终是改变 http 响应,忽略它会导致无用的缓存。 (5认同)

Leo*_*lev 5

浏览器缓存键是请求方法和资源 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
Run Code Online (Sandbox Code Playgroud)

  • 可以肯定的是,`#fragment` 部分永远不会用作缓存键。无论如何,它不存在于 HTTP 请求中。这是浏览器功能的一部分,而不是 HTTP。 (4认同)