Nginx 1.24 的 access_log 里,Googlebot 请求有 62% 返回 304,站点统计面板显示抓取正常,可文章改了标题两周,搜索结果里还是旧文案,重新提交 sitemap 也没有变化。
真正麻烦的地方在于,几个原因的现象几乎一样。源站返回 304 时只对比了文件 mtime,模板改动并没有更新这个时间;Last-Modified 由 CDN 节点回填,各节点时间不一致,蜘蛛拿到的验证结果互相矛盾;页面正文变了但 ETag 仍是旧值,蜘蛛认为内容没变直接复用缓存;改标题只动了数据库,未触发页面缓存刷新,源站返回的仍是旧 HTML。
动手时先按状态码统计蜘蛛请求占比
awk '{print $9}' access.log | sort | uniq -c | sort -rn | head
然后看单篇页面的响应头里 ETag 与 Last-Modified
curl -sI https://www.example.com/post-1024/ | findstr /i "etag last-modified"
强制让页面缓存失效后复验
curl -s -X PURGE https://www.example.com/post-1024/
等前面都确认过,再重新抓取并对比正文摘要
curl -s https://www.example.com/post-1024/ | findstr /c:"新标题"
恢复的判定其实很直接。改完三天后该页在日志里首次出现 200 全量响应,索引里的标题同步换成新版,304 占比降到三成左右。
容易忽略的是,304 本身不是问题,问题是源站用错了验证依据,蜘蛛每次都被告诉内容没变。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
