站内搜索页把关键词直接拼进 canonical,中文没做 urlencode。浏览器会自动纠正所以看着正常,蜘蛛按原样请求直接拿到 400,整页被判抓取失败。

一开始怀疑是「同一页面还有一份编码后的地址,两个都在跑」,查了一圈,方向不对。

原因不止一个,得分开看。模板直接输出原始中文,没有编码。还有一种是服务端对非法字符直接返回 400,没有兜底。

不容易想到的是,canonical 和 og:url 同时出错,问题被放大。

上来先看 canonical 的原始输出

curl -s 'https://www.example.com/search?q=seo' | grep -i canonical

随后用未编码地址请求复现 400

curl -s -o /dev/null -w '%{http_code}\n' 'https://www.example.com/search?q=优化'

接着输出前统一做一次编码

rawurlencode($kw)

复

查

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

恢复的判定其实很直接。编码后同一地址返回 200,canonical 与浏览器地址一致,这批搜索页的抓取失败条目三天内清零。

补一句。中文参数在 canonical 里必须先编码,浏览器会自动纠正,蜘蛛不会。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189