缓存时间设得太短,访客反复下载相同文件;设得太长,更新后又可能看到旧内容。制定静态资源缓存规则与刷新策略,关键是区分文件是否会变、变更后如何识别,以及发布时怎样验证新旧版本。
1. 先按更新频率给资源分类
内容站常见的静态资源包括文章配图、站点图标、字体文件、PDF 附件和页面模板所引用的资源。它们的更新节奏并不相同:长期不改的字体文件适合较长缓存;需要替换的首页横幅或下载附件,则要预留更快的刷新方式。
先列出资源路径、更新频率、是否允许旧版本继续使用,以及谁负责发布。不要只按文件类型决定时长:一张 PNG 可能多年不变,也可能每天替换;判断依据应是更新方式,而不是扩展名。
2. 文件内容变化时使用指纹名称
发布时可将文件内容摘要加入文件名,例如把 brand.woff2 改为带有内容指纹的名称。内容变化就生成新名称,旧文件可以继续缓存,新页面则引用新文件。这比反复清理所有访客的本地缓存更可控,也是静态资源缓存规则与刷新策略中最直接的版本区分办法。
适合:字体、图标、配图等通过页面引用、能够随发布更新路径的文件。限制是旧文件不能在新页面切换前被提前删除;若页面、邮件或外部文档仍引用旧路径,应保留旧文件一段时间。
3. 按版本稳定性设置有效期
对带指纹、内容确定不变的文件,可考虑将浏览器缓存设为较长周期,例如一年,并配合 immutable 表示在有效期内不必主动重新验证。这个期限只适合确保内容一变就换文件名的场景;如果原路径会被直接覆盖,就不应套用。
会被原路径替换的资源可采用较短有效期,例如数分钟到数小时,具体取决于更新频率和访客接受旧内容的时间。入口 HTML 通常需要及时检查更新,可要求缓存每次使用前重新验证;这不等于禁止保存副本。用浏览器开发者工具检查响应头,确认实际生效的规则,而非只看配置文件。
4. 用验证器减少重复传输
对路径不变、内容偶尔变化的文件,可启用 ETag 或 Last-Modified。浏览器再次请求时携带已有版本信息;若文件未变,服务器可返回“未修改”状态,避免重新传输完整内容。验证器省流量,但仍会产生请求,因此不如指纹文件名配合长缓存减少访问。
两种验证器通常由服务器或应用按响应生成。若多个节点提供同一资源,需确认它们对内容版本的判断一致;否则可能出现反复验证或用户间表现不一。不要把验证器当作发布刷新机制的替代品:文件已更新却没有正确识别变化,访客仍可能拿到旧副本。
5. 把发布与检查纳入同一流程
- 发布前生成新文件名,并更新页面中的资源引用。
- 先上传新文件,再发布引用它的页面,避免页面指向尚不存在的路径。
- 抽查页面源代码和响应头,确认新旧资源路径、缓存时长及验证行为符合预期。
- 用浏览器强制刷新或清除该站点缓存进行复核;若使用 Service Worker,还要检查其缓存清单和更新逻辑,因为它可能独立保存旧资源。
- 发现错误时优先回滚页面引用或发布修正版本,不要假定所有访客清缓存后问题就会消失。
如果内容发布频繁,记录资源版本与发布时间,能帮助编辑和维护人员判断问题来自页面引用、浏览器缓存还是 Service Worker。这样,静态资源缓存规则与刷新策略就不只是一个有效期数字,而是一套可检查、可回退的发布约定。
常见问题
缓存一年会不会导致更新失败?
若文件内容变化时一定更换指纹名称,旧文件的长期缓存通常不会阻止新页面加载新版本;原路径覆盖则有风险。
短有效期和重新验证有什么区别?
短有效期到期后再请求资源;重新验证则询问资源是否变化,未变化时通常无需传输完整文件。
只改查询参数能刷新文件吗?
不少环境会把查询参数视为资源标识的一部分,但行为可能受代理或应用配置影响。应在目标环境验证;使用新文件名通常更易排查。
什么时候需要清理缓存?
指纹文件正常发布一般不必清理旧缓存。原路径覆盖、错误文件已广泛缓存或紧急修复时,才考虑清理相关缓存并验证结果。