之前也碰到过,修改 .css 文件后,无论怎么清理缓存,都无法更新文件内容,最后只能通过给文件名加版本号实现。

今天又研究了一下,发现原来是 Cloudflare 的问题。

config

提到缓存,大家都会想到浏览器缓存,上图中的 TTL 也是对浏览器缓存指定的过期时间。

然而,Cloudflare 这样的 CDN 也会对 .css 等静态资源进行缓存。

在上图中的设置界面我们可以手动清除部分或全部文件的缓存,再通过 Ctrl+F5 刷新浏览器缓存,即可加载最新版的文件。

深入

可以在 DevTools 里面观察对应文件的请求:

req0

这是我在 CF 和浏览器均删除缓存后的第一次请求。可以看到 Cf-Cache-StatusMISS,表示没有击中 CF 的缓存。

req1

刷新后,Status Code 变成了 200 OK (from memory cache),表示数据命中了内存缓存。

此时重启浏览器再访问,Status Code 变成了 200 OK (from disk cache),表示数据命中了磁盘缓存。

这些缓存被称为强缓存,在缓存有效期内,浏览器可以不向服务器发起请求,直接使用本地保存的资源。因此,即使源站资源已经更新,浏览器也不一定会立刻获取最新版本。

除了强缓存,还有一种常见机制叫协商缓存,即之前碰到过的 304 Not Modified。浏览器请求时带上了本地缓存的 Last-ModifiedETag,由服务器或 CDN 判断文件是否变化;如果没有变化,则返回 304 告知浏览器继续使用本地缓存。