这类问题我又碰上了一次。把 WordPress 默认搜索换成 Elasticsearch 之后,结果页地址从 /?s= 变成 /search/q/关键词,三周内索引里多出六万多条,全是几乎一样的列表页。

排查方向其实有限,先把可能性排一排。新路由没有继承旧的 noindex 规则,模板漏洞直接放开了;搜索词被写进 title 和 H1,长尾垃圾词被批量索引;结果页之间互相内链,蜘蛛顺着无限翻下去。

先统计新搜索路由被收录的规模

curl -s 'https://www.baidu.com/s?wd=site%3Awww.example.com%2Fsearch' -A 'Mozilla/5.0' | grep -c 'example.com/search'

然后在搜索模板里补 noindex 与 canonical

add_action('wp_head', function(){ if (is_search()) { echo '<meta name="robots" content="noindex,follow">'; } });

robots 里加上搜索路径的兜底规则

printf 'User-agent: *\nDisallow: /search/\n' >> /var/www/html/robots.txt

中途换过一次思路,把范围缩到最小的那一层,反而快了。

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

恢复的判定其实很直接。两周后 site 查询里 /search 结果清零,抓取日志中搜索路径请求占比从三成降到不足 2%。

补一句。换搜索组件时最容易漏的是旧模板里那行 noindex,新路由不会自动继承任何规则。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189