先看现象。用蜘蛛 UA 请求文章地址,命令行返回 200 和完整 HTML,但源站日志里同一条请求记录成 404,过了两天页面真的从索引里掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。CDN 命中缓存直接返回,请求根本没到源站日志。少数情况下是应用层按 UA 做了判断,分流到了另一个不存在的路径。
还有一种情况,日志里记录的是内部重写后的 URI,不是用户请求的地址。
另外,多台源站负载均衡,日志分散在不同机器上。
动手时先确认请求命中还是回源
curl -sI -A 'Baiduspider' https://www.example.com/a/1.html | grep -i -E 'x-cache|age'
然后在源站按真实 IP 找这条请求
grep '66.249' /var/log/nginx/access.log | tail -20
再往下核对日志里记录的 URI 与实际路径
awk '{print $7}' access.log | grep -c '\.html'
剩下的就是把日志改成记录 $request 完整请求行
log_format main '$remote_addr "$request" $status';
改完先别撤,确认这几项。源站日志能查到这条请求且状态为 200,CDN 的缓存状态从 HIT 变为 MISS 后复测可回源,索引里的页面重新出现。
补一句。日志看到的地址和蜘蛛请求的地址可能不是一回事,排查前先确认日志字段记录的是原始请求还是重写后的 URI。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
