运维把 etag 关掉之后,每次刷新 Network 里静态资源全是 200,Size 那一列是完整的好几百 KB,304 一条都没有。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,没有 ETag 只剩 Last-Modified,部分代理和浏览器在时间精度、时区上对不齐,就不发 If-Modified-Since。协商缓存等于失效,每次都全量回源。

碰到「etag 关闭」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

etag on;
gzip on;
gzip_vary on;

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。

具体做法是,恢复 etag on,让响应带 ETag,客户端下次才会带 If-None-Match;确认压缩模块没把内容改掉,压缩后字节变了 ETag 就对不上;用 curl 带 If-None-Match 请求一次,看是否真的返回 304。

最后用这个标准收尾,刷新页面静态资源状态是 304,传输体积接近 0。

作者 9823189