站内搜索结果被Google索引了?别慌,你不是第一个“中招”的
打开 Google Search Console 一看:几百个 ?s=xxx 的页面赫然在列,点开全是差不多的标题和摘要,只有搜索词不一样。你心里一沉——这哪是收录,这是给Google塞了一堆“内容压缩包”。
更糟的是,这些页面正悄悄吃掉本该留给产品页、文章页的抓取配额。你的干货还在排队,而搜索结果页已经排到了首页。
为什么Google会把站内搜索结果页当成“好内容”?
Googlebot 不会读心,它只看链接和HTML标签。只要你的网站上有指向 ?s=关键词 的链接,比如热门搜索词模块、分类页底部的推荐词、甚至面包屑里的“搜索:XXX”,它就会爬进去,照单全收。
我帮一个做母婴用品的电商改过这个问题。他们首页有个“妈妈们最近在搜”的滚动栏,点了就跳转到带参数的搜索页。三个月下来,Google 收录了近万个这类页面,其中大部分内容重复度极高——标题都是“关于‘宝宝湿疹’的搜索结果”,正文就是几条商品卡片加一句“共找到XX件商品”。
更麻烦的是,WordPress 默认不给搜索页加 noindex。你没动过设置,它就默认“欢迎来收录”。这不是疏忽,是系统出厂设定。
3个你必须检查的“泄漏点”
搜索结果页URL结构是否混乱?
你的搜索链接长什么样?是 ?s=xxx、/search/xxx,还是 ?q=xxx?不同插件、主题甚至手动加的代码,可能同时生成好几种格式。
之前帮一个知识付费博客排查时,发现它同时存在 ?s= 和 ?search= 两个参数,同一个词搜两次,出来两个URL;再加上分页 ?page=2,一个词直接变出四五个索引页。
具体做法:打开浏览器,在Google里搜 site:你的域名.com ?s=,再换着试 ?q=、/search/。如果返回几十页以上,说明漏子已经不小了。
站内搜索是否生成了“死胡同”链接?
很多网站喜欢在搜索结果页底部加“相关搜索”或“猜你想搜”,比如搜完“时间管理”,底下跳出“番茄工作法”“GTD”“每日计划表”三个链接——每个都指向新的搜索结果页。
更隐蔽的是面包屑导航。用户点进 ?s=咖啡机 页面后,面包屑显示“首页 > 搜索:咖啡机”,而这个“搜索:咖啡机”本身就是一个可点击、可索引的链接。
这些链接对用户可能是顺手一戳,对Googlebot却是“请进,请多爬几层”。
搜索结果页是否被内部链接指向了?
翻翻你的首页、分类页、甚至文章末尾的推荐模块。有没有一个叫“热门搜索”“大家都在搜”的小板块?里面每个词是不是都套着 <a href="?s=xxx">?
我见过最典型的情况:一个旅游攻略站,把“热门目的地搜索”做成轮播图放在首页顶部。20个词,20个带参数的链接。Googlebot每次抓首页,都顺手把这20个页面拎进队列。
真实案例:那个旅游站的搜索页跳出率常年95%以上——用户点进来,发现不是文章而是商品列表或空结果,秒关。Google看多了,直接给整个站打上“低质交互”标签。
如何用 robots.txt 和 noindex 堵住漏洞?
用 robots.txt 直接屏蔽抓取
这是见效最快的一步。打开你网站根目录下的 robots.txt 文件,加几行:
User-agent: *
Disallow: /*?s=
Disallow: /*?q=
Disallow: /*?search=
Disallow: /*?page=
注意:robots.txt 只是告诉Google“别来这儿”,但它拦不住别人外链带来的索引。所以这只是第一道门,还得配把锁。
给搜索结果页统一加上 noindex 标签
关键动作:让每一页搜索结果自己说清楚——“我不值得被收录”。
如果你用的是 WordPress,在主题的 header.php 或搜索模板(通常是 search.php)里,找到 <head> 区域,插入这段:
<?php if (is_search()) : ?>
<meta name="robots" content="noindex, follow">
<?php endif; ?>
意思是:别索引我,但可以顺着我页面里的其他链接继续爬。这样既清掉了垃圾页,又不耽误抓取真正重要的内容。
划重点:这段代码必须放 <head> 里,而且不能被 robots.txt 拦在外面。否则Googlebot连看都看不到这句话。
处理分页参数
带 &page=2 的搜索结果页,内容基本和第一页一样。没必要留着。
除了在 robots.txt 里加 Disallow: /*?*page=*,更稳妥的做法是在代码里统一判断:只要是搜索页的分页,也加上 noindex。
比如 WordPress 可以这样扩展逻辑:
<?php if (is_search() && get_query_var('paged') > 1) : ?>
<meta name="robots" content="noindex, follow">
<?php endif; ?>
为什么说“移除索引”比“禁止抓取”更重要?
改完代码、更新 robots.txt,不代表问题就结束了。那些早就被收录的老页面,还挂在Google搜索结果里,占着位置、拉低点击率。
我帮一个客户处理时,只做了技术防护,没碰历史索引。结果两个月后,他在Search Console里一查,搜索结果页仍占总收录量的将近三分之一——全是旧债。
必须补上这一步:
- 登录 Google Search Console
- 在“网址检查”工具里输入
site:你的域名.com ?s= - 看到列表后,点右上角“请求索引”旁边的“…” → 选择“移除” → “临时移除”
- 提交后,等Google重新抓取你刚加上的
noindex标签
这个动作做完,老页面通常一周内就会从搜索结果里淡出。
还有哪些“隐形”搜索结果页容易被忽略?
分类筛选页
电商网站的“按颜色筛选”“按价格区间筛选”,本质也是搜索——只是参数从 ?s= 换成了 ?color=red&size=m。
这类页面一旦参数组合多起来(比如5种颜色 × 4种尺寸 × 3个价格档),轻松产出上百个高度相似的页面。
检查方法:在Google里搜 site:你的域名.com ?color= 或 site:你的域名.com ?price=,看看有没有成片出现。
AJAX 异步加载的搜索
有些网站用JS做搜索,地址栏不变,但内容实时刷新。这种Googlebot本来抓不到——除非你用了 history.pushState() 把URL改成 #/search/关键词 或 /search/关键词。
只要URL变了,它就当真页面处理。而这类页面往往没有 <title>、没有正文语义结构,更不会主动加 noindex。
解决方案:凡是你用 pushState 动态生成的搜索类URL,都要在页面 <head> 里手动加 noindex;或者用 <link rel="canonical" href="https://你的域名.com/"> 指回首页,避免权重分散。
今天就能执行的1个操作步骤
打开你正在用的 WordPress 后台 → 外观 → 主题编辑器 → 找到 header.php(或搜索模板 search.php),在 <head> 标签内粘贴这段代码:
<?php if (is_search()) : ?>
<meta name="robots" content="noindex, follow">
<?php endif; ?>
保存。
然后立刻登录 Google Search Console → 左侧菜单点“网址检查” → 输入 site:你的域名.com ?s= → 点击任意一个结果旁的“请求索引”下拉箭头 → 选“移除” → “临时移除”。
全程5分钟。今晚睡前再看一眼Search Console,你会发现“已索引”数字开始往下掉——因为Googlebot终于能把力气省下来,专心抓你写的那篇干货了。