Bra*_*man 113 html javascript css caching
我们希望在生产部署中缓存破产,但不要浪费大量时间来确定系统.我的想法是在当前版本号的css和js文件的末尾应用一个参数:
<link rel="stylesheet" href="base_url.com/file.css?v=1.123"/>
Run Code Online (Sandbox Code Playgroud)
两个问题:这会有效地打破缓存吗?这个参数是否会导致浏览器永远不会缓存来自该URL的响应,因为param表明这是动态内容?
Mar*_*all 107
param ?v=1.123表示一个查询字符串,因此浏览器会认为它是一条新的路径?v=1.0.因此导致它从文件而不是从缓存加载.如你所愿.
并且,浏览器将假定下次调用时源将保持不变,?v=1.123并应使用该字符串缓存它.因此它将保持缓存状态,但是您的服务器已设置,直到您移动到?v=1.124等等.
Pek*_*ica 36
两个问题:这会有效地打破缓存吗?
是.甚至Stack Overflow使用这种方法,虽然我记得他们(每天有数百万访问者和数以万计的不同客户端和代理版本和配置)有一些奇怪的边缘情况,即使这还不足以打破缓存.但一般的假设是,这将起作用,并且是打破客户端缓存的合适方法.
这个参数是否会导致浏览器永远不会缓存来自该URL的响应,因为param表明这是动态内容?
不会.该参数不会改变缓存策略; 服务器发送的缓存标头仍然适用,如果它没有发送任何,则浏览器的默认值.
jfr*_*d00 22
将版本号放在实际文件名中更安全.这允许一次存在多个版本,因此您可以推出新版本,如果仍然存在请求旧版本的任何缓存HTML页面,他们将获得适用于其HTML的版本.
请注意,在互联网上任何一个最大的版本化部署中,jQuery使用实际文件名中的版本号,它可以安全地允许多个版本共存,而无需任何特殊的服务器端逻辑(每个版本只是一个不同的文件).
当您部署新页面和新链接文件(这是您想要的)时,这会破坏缓存一次,从那时起,这些版本可以被有效地缓存(您也想要).
has*_*nge 11
正如其他人所说的那样,使用查询参数进行缓存清除通常被认为是一个坏主意(tm),并且已经存在了很长时间.最好在文件名中反映版本.Html5 Boilerplate 建议不要使用查询字符串等.
也就是说,在我所看到的引用来源的建议中,所有人似乎都从史蒂夫·索德斯的一篇2008年的文章中汲取了他们的智慧.他的结论是基于当时代理人的行为,他们现在可能相关或不相关.但是,在没有更多当前信息的情况下,更改文件名是安全的选择.
一般来说,这应该没问题,但如果有一个配置为忽略请求参数的中间缓存(代理),则可能无法正常工作.
例如,如果您通过Akamai CDN提供静态内容,则可以将其配置为忽略请求参数以防止使用此方法进行缓存清除.