站内搜索结果页:要不要被索引

站内搜索结果页几乎都该挡在 Google 索引之外。本文讲清这条规则、两个真正的例外,以及如何把已经泄漏进去的成千上万个 /search?q= URL 干净下架。

多数网站上,站内搜索结果页是低质量 URL 泄漏到 Google 的最大来源。它们动态生成、数量无限、彼此高度近似、更新速度比爬虫还快。Google 自己的文档说得很直接:默认情况下,站内搜索结果不该进索引。本文讲清这条规则、两个让它进索引反而能赚流量的例外,以及把已经泄漏进去的搜索 URL 干净清掉的具体步骤。

一句话结论

  • 默认加 noindex 在搜索模板里加 <meta name="robots" content="noindex, follow">(或用 X-Robots-Tag HTTP header),让 Google 自由抓取,它才读得到这条指令。
  • noindex 生效之前,不要在 robots.txt 里 Disallow: /search 页面被屏蔽了,Googlebot 就永远看不到上面的 noindex,URL 反而以「只有裸 URL」的形式留在索引里。
  • 只有两个例外: 用高价值查询做成的精选 landing 页,以及有真实需求的稳定电商过滤组合。其余一律 noindex
  • 想快速清理: 先加 noindex,再用 Search Console 的 Removals(移除) 工具按 URL 前缀做一次约六个月的临时隐藏,给 noindex 留出传播时间。没有重新抓取,Google 明说下架可能「要好几个月」。

搜索 URL 为什么会漏进去

站内搜索把用户输入直接拼到 URL 上:/search?q=react+hooks/search?q=react%20hooks/search?q=foo+bar+baz+qux。每个不同查询都是新 URL。哪怕是小站,爬虫也能从内链、sitemap、外部 referrer 发现上千条。绝大多数内容很薄(一组标题列表),互相重复(同一查询不同编码),或者夹带垃圾查询。从 2007 年起 Google 就建议站长别让这些进索引,截至 2026 年 6 月这条建议没变。

怎么判断踩坑了

  • Search Console 的 Page indexing(页面编入索引) 报告里,/search?q=... 大量出现在「Crawled — currently not indexed」或「Duplicate, Google chose different canonical」。
  • site:yoursite.com inurl:search 返回几百条你根本没打算发布的页面。
  • 有 spammer 拿垃圾查询去 ping 你的搜索接口,那些 URL 被收录了。
  • sitemap 里意外包含 ?q= URL,因为 URL 发现脚本爬了整站。

快速结论

默认:所有站内搜索结果页加 noindex。在模板里加 robots noindex,让 Google 自由抓取,它才读得到指令。不要先在 robots.txt 里 Disallow——那会让 Google 看不到 noindex,最后变成只剩裸 URL 的列表。两个例外见下。

两个例外

确实有两种情况,让搜索页进索引反而能赚流量。

例外 1:精选 landing 页。 如果你能预生成一组高价值查询作为真正的页面——/search/react-hooks/search/python-async——那已经不是搜索结果,而是有独立标题、描述、编辑过文案的 landing 页。当作完整文章处理。URL 看起来像搜索,内容是精选的。

例外 2:类目过滤式查询。 如果你的「搜索」其实是稳定商品库的过滤组合(/search?category=running-shoes&size=10),并且这种组合有真实需求,可以让它进索引。但只让符合真实搜索意图的组合进,不是每一种过滤排列都进。

其余情况:noindex

正确加 noindex

下面两种任选其一。Google 说两者效果相同,看你的技术栈哪个更顺手。

<!-- 搜索模板里,针对真实查询页面加 -->
<meta name="robots" content="noindex, follow">
# 或用 HTTP header(非 HTML 响应更干净)
X-Robots-Tag: noindex, follow

确保指令在任何重定向或 canonical 之前生效。爬虫抓到页面、读到 noindex、就会下架。保留 follow,结果页里指向真实文章的链接还能传递权重。但有个前提:Google 只在下一次重新抓取该 URL 时才会执行这条指令,而官方文档明说低优先级页面「可能要好几个月 Googlebot 才会再访问一次」。只挂一个 noindex 而不催,成千上万个搜索 URL 可能在索引里赖很久。

清理已经漏进去的 URL

如果已经有上千个搜索 URL 被收录了,把持久信号(noindex)和快速临时隐藏(Removals 工具)配合用。三种手段对比如下:

手段速度作用范围是否持久
模板上加 noindex慢(等重新抓取,可能要好几个月)单 URL,所有匹配页面是,重新抓取后生效
Removals 工具「临时移除 URL」约 24 小时内隐藏单个 URL /search? 这类 URL 前缀否——约 6 个月后失效
robots.txt 里 Disallow: /search立刻省抓取预算按模式整批否——本身不会下架

干净的清理顺序:

  1. 在搜索模板里加上 noindex, follow,先把持久信号铺好。
  2. 在 Search Console 里打开 Removals → Temporary Removals → New Request,选「移除所有带此前缀的 URL」,填你的搜索路径(例如 https://yoursite.com/search?)。约 24 小时内匹配到的 URL 全部隐藏。
  3. 记住限制:临时移除大约只持续 六个月。是第 1 步加的 noindex 在这个窗口过后让移除继续生效,所以别跳过。
  4. 接下来几周观察 Page indexing 报告变小,Google 重新抓取后会执行 noindex
  5. 只有在 noindex 生效之后,才可以选择给 robots.txt 加 Disallow: /search?,省掉后续查询的抓取预算。

顺序很关键。先 Disallow 会在 Google 读到 noindex 之前把它挡在门外,这正是网站最常见、最容易把这些 URL 钉死在索引里的错法。

sitemap 和内链清理

页面上的 noindex 是策略层。sitemap 和内链是发现层。这两边一直指向搜索 URL,爬虫就一直在抓——就算最终不收录,抓取预算还是被浪费。

  • 审 sitemap 生成器。如果它靠遍历页面找链接,就会把搜索框里的示例查询作为 ?q= URL 收进 sitemap。构建阶段过滤掉这种模式。
  • 减少模板里指向搜索的链接。常驻搜索框 submit 到 /search?q= 没问题;底部硬编码 10 条「热门搜索」URL 就不行。
  • 清理完之后,每周用 site:yoursite.com inurl:search 跑一次,连续四周看收录数下降。如果数据停在某个值,找还在引用的链接删掉。

防垃圾查询注入

如果搜索接口把用户输入直接回显进页面 title 或 H1,你就免费送了一个 SEO 注入向量。spammer 用他们的目标关键词(俄文、日文、医药词常见)ping 你的搜索,结果 URL 就是你域名上一个薄弱页,他们要的关键词正好在 title 里——这正是他们想被收录的产物。

两道便宜的防御。第一,渲染前对用户查询做转义和截断——永远别让原始文本进 <title> 或 H1。第二,就算模板上挂了 noindex,也要在 CDN 层给这个接口加 rate limit。一个 IP 一小时打 /search?q= 500 次不是真人,直接返回 429,把爬虫追这种 URL 的路彻底断掉。

容易踩的坑

  • 没先加 noindex 就给 robots.txt 加 Disallow: /search?。Google 抓不到页面、读不到 noindex,URL 留在索引里、只剩裸 URL。
  • 首页、header、footer 大量挂内链指向站内搜索。每条链接都是抓取邀请。加了 noindex 也要减少内链数量。
  • sitemap 包含 ?q= URL,因为爬虫生成器一并收了。sitemap 构建阶段过滤掉。
  • 忘了站内搜索 referrer 也会出现在 Search Console performance 报告里——那些是站内搜索,不是 Google 上的搜索。
  • 让用户输入原样回显在页面标题里(Search results for "spam-phrase-here")。spammer 用这个做 SEO 注入。

FAQ

  • noindex 还是 canonical: noindex。canonical 适用于「这是另一个 URL 的相同内容」。搜索结果不是某个主页面的副本,是根本不该进索引的薄弱页面。
  • 多久这些页面才会真正下架?: 只挂 noindex 的话,Google 得先重新抓取每个 URL,官方文档说低优先级页面这可能要好几个月。想催,就在 URL Inspection 里 Request indexing,或用 Removals 前缀一天内把全部隐藏掉。
  • Removals 工具的「六个月」是什么意思?: 临时移除把 URL 隐藏约六个月,之后除非有持久信号(noindex 或 404/410),它们可能再冒出来。Removals 工具负责快,noindex 负责让改动持久。
  • 搜索结果的分页呢?: 同一规则。每页都 noindex。分页本身也是噪音。
  • 我的搜索是 Algolia / Meilisearch / 纯前端 JS 的,要管吗?: 只要用户搜索时 URL 会变(?q=),Google 就会看到 URL 并尝试抓取。如果完全前端、URL 不变,就没东西要 noindex。
  • noindex 搜索页会不会伤 SEO?: 不会。这些页面本来就排不到什么有竞争力的关键词。清掉提升的是抓取效率,还会拉高整站索引 URL 的平均质量。
  • 电商站的 facet / filter URL 怎么办?: 一样的逻辑。默认 noindex。白名单挑一小批高流量组合,做成有人写过文案的真实页面。
  • Bing 行为一致吗?: Bing 遵循同样的 noindexrobots.txt 语义。主流爬虫行为一致。

相关阅读

标签: #独立开发 #SEO #Technical SEO #收录 #search