先看现象。前端路由改造后旧地址统一用 location.replace 跳转 浏览器正常 百度快照打开是一张白页 必应直接判成软 404 抓取诊断显示返回 200 内容为空 半个月掉了 2000 条收录

排查方向其实有限,先把可能性排一排。跳转写在 DOMContentLoaded 之后 蜘蛛渲染前就把 HTML 抓走。还有一种是页面没有任何静态内容和 noscript 提示。

少数情况下是旧地址返回 200 而不是 3xx 被当成有效页。

不容易想到的是,渲染服务没有为新旧路由建立映射。

上来先看原始 HTML 里有没有正文

curl -s https://www.example.com/old/123 | wc -c

随后改成服务端 301 输出

location /old/ { return 301 https://www.example.com/p$request_uri; }

页面里补 noscript 与静态首段

grep -c noscript /var/www/html/old/123.html

末了用抓取工具对比渲染前后 DOM 大小

curl -s https://www.example.com/old/123 | grep -c '<p>'

怎么算真的好了,看的是同一批现象。旧地址返回 301 快照能打开对应新页 抓取诊断里的内容长度与新页一致。

提醒一点。客户端跳转对用户是瞬间的 对蜘蛛是一次请求就结束 该在服务端做的事别丢给浏览器。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189