浏览器如何缓存 Favicon
浏览器对 favicon 的缓存很激进,并且把它和页面自身的缓存分开存储,往往会不顾普通刷新地把一个图标保留好几天。这就是为什么一个改过的 favicon 常常仍显示旧图像。强制刷新最可靠的办法是改变图标的 URL(通常是一个版本查询字符串,比如 /favicon.ico?v=2)再做强制刷新。
favicon 为什么这么顽固
favicon 受到特殊对待。浏览器把它们保存在一个与普通 HTTP 缓存分开的存储里,用很长的生命周期持有它们,并且不一定会在普通刷新时丢弃它们。有些还保留一个跨会话存续的、配置级的 favicon 数据库。你网站前面的 CDN 又叠加了第二层缓存。
由此带来的结果是:原地编辑图标文件常常是无形的——浏览器已经为那个 URL 存了一个图标,看不出有理由再问一次。它是按 URL 作键的,所以修复的办法是改变 URL,而不只是改变它背后的字节。
强制取到全新的 favicon
- 1
改变 URL
追加一个版本查询字符串(/favicon.ico?v=2),好让浏览器把它当作一个新资源去获取。每次改动时把数字加一。
- 2
强制刷新或使用无痕窗口
Cmd+Shift+R / Ctrl+F5,或者一个全新的无痕窗口,都能绕过浏览器存储的副本。
- 3
清除任何 CDN
如果有 CDN 挡在网站前面,就让 favicon 路径失效,好让边缘节点在浏览器看到之前就停止提供旧文件。
Favicon 缓存常见问题
为什么我的 favicon 不更新?
浏览器正在从它那个分开的 favicon 存储里提供一个缓存副本,或者一个 CDN 正在派发旧文件。用一个版本查询字符串改变图标 URL,并在无痕窗口里强制刷新。
我怎么清除 favicon 缓存?
没有可靠的按图标清除的按钮,所以改用改变 URL 的办法(/favicon.ico?v=2),它彻底绕开了缓存。实在不行,一个无痕窗口或一个不同的浏览器配置文件都没有存储的图标。
favicon 缓存在各浏览器之间有差异吗?
有。每个浏览器、往往每个配置文件,都保留自己的 favicon 存储,各有各的生命周期,这就是为什么同一时刻一个图标在一个浏览器里看起来是更新过的,在另一个里却是旧的。