先把当时的情况摆出来。搜索页的 title 输出成「搜索结果 站点名」,不区分关键词,索引里出现了两千多个同名标题的页面。
把日志和配置对完,能解释这个现象的基本就这几处。模板没有把查询词写进 title。也可能是搜索页没有 noindex,robots 也只挡了部分路径。
另外,分页参数让同一个搜索产生上百个变体。少数情况下是站内搜索被做成 SEO 落地页,主动提交了 sitemap。
上来先看搜索页实际标题
curl -s 'https://www.example.com/?s=nginx' | grep -o '<title>[^<]*</title>'
随后把查询词写进标题
add_filter('document_title_parts', function($t){ if(is_search()){ $t['title']='搜索 '.get_search_query().' 的结果'; } return $t; });
搜索页整体 noindex
add_filter('wp_robots', function($r){ if(is_search()){ $r['noindex']=true; $r['follow']=true; } return $r; });
剩下的就是确认 sitemap 里没有搜索地址
curl -s https://www.example.com/sitemap.xml | grep -c '?s='
怎么算真的好了,看的是同一批现象。搜索页返回的 head 里有 noindex,标题带上查询词,索引里同名标题的页面在六周内清空。
容易忽略的是,搜索页做流量入口可行,但要挑少量高价值词单独做成静态页,而不是让整个搜索模块被索引。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
