我们希望在生产部署时缓存 bust,但不要浪费大量时间来找出一个系统来这样做。我的想法是将参数应用到具有当前版本号的 css 和 js 文件的末尾:
<link rel="stylesheet" href="base_url.com/file.css?v=1.123"/>
两个问题:这会有效地破坏缓存吗?param 是否会导致浏览器永远不会缓存来自该 url 的响应,因为 param 表明这是动态内容?
我们希望在生产部署时缓存 bust,但不要浪费大量时间来找出一个系统来这样做。我的想法是将参数应用到具有当前版本号的 css 和 js 文件的末尾:
<link rel="stylesheet" href="base_url.com/file.css?v=1.123"/>
两个问题:这会有效地破坏缓存吗?param 是否会导致浏览器永远不会缓存来自该 url 的响应,因为 param 表明这是动态内容?
参数?v=1.123
表示一个查询字符串,因此浏览器会认为它是一个新的路径,比如,?v=1.0
。从而导致它从文件加载,而不是从缓存加载。如你所愿。
并且,浏览器会假设您下次调用时源将保持不变,?v=1.123
并应使用该字符串缓存它。因此,无论您的服务器如何设置,它都会保持缓存状态,直到您移动到?v=1.124
或以此类推。
两个问题:这会有效地破坏缓存吗?
是的。甚至 Stack Overflow 也使用这种方法,尽管我记得他们(每天有数百万的访问者以及数以百万计的不同客户端和代理版本和配置)有一些奇怪的边缘情况,即使这也不足以破坏缓存。但一般假设这是可行的,并且是一种打破客户端缓存的合适方法。
param 是否会导致浏览器永远不会缓存来自该 url 的响应,因为 param 表明这是动态内容?
不会。该参数不会改变缓存策略;服务器发送的缓存头仍然适用,如果它不发送任何,浏览器的默认值。
将版本号放在实际文件名中会更安全。这允许同时存在多个版本,因此您可以推出新版本,如果仍然存在任何请求旧版本的缓存 HTML 页面,他们将获得适用于其 HTML 的版本。
请注意,在 Internet 上任何地方最大的版本化部署之一中,jQuery 在实际文件名中使用版本号,并且它安全地允许多个版本共存,而无需任何特殊的服务器端逻辑(每个版本只是一个不同的文件)。
当您部署新页面和新链接文件(这是您想要的)时,这会破坏缓存一次,然后可以有效地缓存这些版本(您也想要)。
正如其他人所说,使用查询参数进行缓存破坏通常被认为是一个坏主意 (tm),并且已经存在很长时间了。最好在文件名中反映版本。Html5 Boilerplate建议不要使用查询字符串等。
也就是说,在我所看到的引用来源的建议中,似乎都从Steve Souders 2008 年的一篇文章中汲取了智慧。他的结论是基于当时代理人的行为,这些天它们可能相关,也可能不相关。尽管如此,在没有更多最新信息的情况下,更改文件名是安全的选择。
它将破坏缓存一次,在客户端下载资源后,每个其他响应都将从客户端缓存提供,除非: