它是文件名还是整个URL用作浏览器缓存中的键?
希望浏览器缓存资源JavaScript,CSS,图像等,直到有可用的新版本,然后确保浏览器取回并缓存新版本。
一种解决方案是在资源的文件名中嵌入一个版本号,但是将要以这种方式管理的资源放置在其中具有修订号的目录中会做同样的事情吗?文件的整个URL是用作浏览器缓存中的键,还是仅文件名本身和一些元数据?
如果我的代码从获取/ r20 / example.js
变为/ r21 / example.js
,我可以确定example.js
的修订版20已被缓存,但是现在已经获取了修订版21. 现在被缓存了吗?
解决方案
回答
要看。它应该是完整的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
回答
我99.99999%肯定是用于在浏览器中缓存资源的整个url,因此url方案应该可以正常工作。
回答
是的。从缓存角度来看,不同的路径是相同的。
回答
当然,它必须使用整个路径'/r20/example.js'与'/r21/example.js'可能是完全不同的图像。我们建议的是一种处理版本控制的可行方法。
回答
在大多数浏览器中,使用完整的URL。
在某些浏览器中,如果我们在url中有查询,该文档将永远不会被缓存。
回答
它们至少需要我们通过完整路径来标识HTTP对象,包括所有查询字符串参数。某些浏览器可能不使用查询字符串来缓存对象,但这与缓存的键无关。
同样重要的是要记住,路径不再足够。 HTTP响应中的Vary:标头会向浏览器(或者代理服务器等)警告除URL之外的任何其他内容,例如URL,cookie,编码值等应用于确定缓存键。
对于基本问题,是的,只需更改.js文件的URL。对于决定缓存键的更大问题,它是URL加Vary:标头限制。
回答
整个网址。在一些区分大小写的老版本浏览器中,我看到了一个奇怪的行为。
回答
是的,URL的任何部分的任何更改(不包括HTTP和HTTPS协议更改)都被浏览器(和任何中间代理)解释为不同的资源,因此将在浏览器缓存中产生单独的实体。
更新:
ThinkVitamin这篇文章中声称Opera和Safari / Webkit浏览器不使用?query = strings缓存URL是错误的。
向URL添加版本号参数是进行缓存清除的一种完全可以接受的方法。
ThinkVitamin文章的作者可能感到困惑的是,在Safari和Opera中,在地址/位置栏中单击Enter会导致其中带有查询字符串的URL的行为不同。
但是,(这是重要的部分!)在缓存网页中的嵌入式/链接图像,样式表和脚本时,无论它们是否带有"?",Opera和Safari的行为都与IE和Firefox相同。 URL中的字符。 (这可以通过在普通Apache服务器上进行的简单测试来验证。)
(如果我有声誉的话,我会对当前接受的答案发表评论。:-)