商品详情接口响应头里有 ETag,但每次值都不同,浏览器带着 If-None-Match 回来,服务端照样返回 200 和完整响应,一天下来 304 数量是 0。日志里能对上时间点,这种反而好排。

ETag 里拼了时间戳或者随机数,同一份内容每次算出来的值都不一样。值一变,If-None-Match 就永远匹配不上。内容没改也应该得到同一个 ETag。这一点先确认清楚,后面就不用反复试。

curl -sI http://127.0.0.1:8080/api/item/1 | grep -i etag
curl -sI http://127.0.0.1:8080/api/item/1 -H 'If-None-Match: "abc"'

围绕「ETag 每次都变」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

处理上按这个顺序:把 ETag 改成对响应体做哈希 内容相同值就相同;去掉拼接的时间戳和进程 id;确认压缩前后算的是同一份内容;用 curl 连发两次 对比响应头里的 ETag。

结果对不对很好判断,两次请求的 ETag 一致 带 If-None-Match 时返回 304 且没有响应体。

作者 9823189