搜索页的 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 就别指望靠规范化兜住。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
