搜索页的 title 写成「关键词 搜索结果 - 站点名」,爬虫按字母表逐个抓取,索引里出现两千多个只有关键词不同的标题,同一模板被判成标题堆砌。

一开始怀疑是「关键词来自 URL,攻击者可构造任意长标题」,查了一圈,方向不对。

原因不止一个,得分开看。title 直接拼接用户输入,没有任何过滤和长度限制。也可能是搜索页允许被抓取,模板又没有 noindex。

少数情况下是搜索结果页之间没有 canonical 归一。

动手时先看一条搜索页实际输出的标题长度

curl -s 'https://www.example.com/?s=redis' | grep -o '<title>[^<]*</title>'

给搜索页标题加固定前缀并截断关键词

add_filter('document_title_parts', function($t){ if (is_search()) { $t['title'] = '搜索结果'; } return $t; });

搜索页统一 noindex follow

add_filter('wp_robots', 'wp_robots_noindex');

末了统计索引里同模板标题的数量

site:www.example.com inurl:"?s="

改完先别撤,确认这几项。搜索页标题固定为「搜索结果 - 站点名」,索引里同模板标题不再增长,搜索页条目逐步退出。

这里还有个坑。把用户输入拼进 title 既影响收录也有反射风险,搜索页能 noindex 就别指望靠规范化兜住。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189