头像换了新图,URL 没变,响应头是 ETag: W/"a1b2",浏览器带 If-None-Match 请求仍返回 304,页面还是旧头像。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
curl -sI https://example.com/avatar/u1.png | grep -i etag md5sum avatar_new.png
弱 ETag 只保证语义等价,不保证字节一致,比较时忽略细节差异。图片处理链路里换了尺寸或压缩参数,算出来的弱校验值可能没变。服务端也可能按文件路径而不是内容生成。这一点先确认清楚,后面就不用反复试。
「弱 ETag」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
具体做法是,图片这类按字节比较的资源用强 ETag;ETag 改成对文件内容做哈希;换图时同时改文件名或加版本参数;用 curl 对比新旧文件的 ETag 是否真的不同。
改完照着核一遍,换图后 ETag 值变化 带旧值的条件请求返回 200 和新图片。
