Nginx 里开的是 etag on,但页面里嵌了一个随机 nonce,两次请求拿到的 ETag 完全不同。日志里 304 只占百分之三,蜘蛛每晚把两万页全部重下。

一开始怀疑是「CDN 与源站各自生成一份 ETag,回源比对时永远不相等」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。ETag 由响应体内容生成,页面里有随机片段时每次算出来的值都不一样。少数情况下是Last-Modified 也被 PHP 写成了当前时间,条件请求两条路都失效。

另外,gzip 版和原文版共用同一个 ETag,编码不同但校验值相同。

连续两次请求对比 ETag 与 Last-Modified

curl -sI https://www.example.com/a/ | grep -i 'etag\|last-modified'

然后找出页面里每次都在变的片段

curl -s https://www.example.com/a/ | grep -o 'nonce="[^"]*"' | head

随后把随机片段改成固定值或移到 JS 里

add_filter('wp_headers', function($h){ unset($h['ETag']); return $h; });

复查 304 的占比

awk '$9==304' access.log | wc -l

恢复的判定其实很直接。两次请求返回同一个 ETag,日志里 304 占比升到七成以上,单日下载体积回落到此前的三分之一。

提醒一点。关掉 ETag 只留 Last-Modified 也能命中,但时间戳如果是动态生成的,两条校验路径会一起失效。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189