给静态网站设置一份说得清的缓存策略
HTML 与带内容哈希的资源采用不同策略,在加载速度和更新可见性之间建立明确约定。
静态文件不等于永远不变。发布后页面还显示旧内容,往往与缓存约定有关。缓存策略应先回答两个问题:这个 URL 的内容是否会变化?变化之后,用户最晚多久应当看到?
让 HTML 能及时更新
HTML 通常包含资源引用和导航。对于更新频率不高的小站,可以使用短时缓存,或要求复用前重新验证。no-cache 允许存储,但要求验证;no-store 才是不应存储,两者含义不同。
Cache-Control: no-cache
ETag: "example-version"
Last-Modified: Fri, 16 Oct 2026 08:00:00 GMT
ETag 和 Last-Modified 由服务器根据资源生成,示例值不要照搬。浏览器在合适条件下发送条件请求,服务器可返回 304,节省正文传输。
长期缓存需要不变的 URL
只有文件名包含内容哈希,且发布时不覆盖同名文件,才适合长期缓存并设置 immutable。例如 app.6f3a91.css 内容变化时生成一个新文件名,并更新 HTML 引用。对始终覆盖的 style.css 设置一年缓存,可能让修改长期不可见。
用实际请求检查
curl -sS -D - -o /dev/null https://example.org/
curl -sS -D - -o /dev/null https://example.org/assets/style.css
分别检查 HTML、CSS、图片和错误页面。确认代理或 CDN 没有覆盖源站响应头。出现问题时,用浏览器网络面板核对资源来自磁盘缓存、内存缓存还是网络,不要用“强制刷新能好”作为最终结论。
发布顺序也影响可靠性
先发布新资源,再发布引用它们的 HTML。保留上一版本资源一段时间,避免旧页面请求资源时遇到 404。回滚时要保证 HTML 和资源版本配套;内容越简单,发布过程越容易验证。