事情本身不复杂,线索都在日志里。access.log 里几千条 Googlebot 请求的响应体大小都是 0,第一反应是 PHP 挂了返回空页,可浏览器打开页面完全正常。

第一反应是「日志只记录了 body 字节,没记 headers 长度,看起来像完全没返回内容」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。Nginx 的 $body_bytes_sent 对 304 响应恒为 0,因为响应体本身就不发送。还有一种是条件请求带了 If-Modified-Since,缓存校验通过后直接返回 304。

还有一种情况,CDN 回源时把 304 透传回来,源站日志因此也被写成了 0。

动手时先统计带 0 字节的请求都是什么状态码

awk '$10==0 {print $9}' access.log | sort | uniq -c

再往下确认 304 占比是否异常偏高

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

临时关掉条件请求看返回体积

curl -sI -H 'If-Modified-Since: Wed, 21 Oct 2026 07:28:00 GMT' https://www.example.com/a/ | grep -i content-length

恢复的判定其实很直接。确认 0 字节请求全部对应 304 之后,页面在 GSC 里仍显示已编入索引,并且带 If-None-Match 重新请求能拿到完整 200 响应体。

补一句。别把 0 字节当成抓取失败去清缓存或者关缓存,304 是省带宽的正常行为,真要看体积得用 %b 加 headers 合计算。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189