多数网站上,站内搜索结果页是低质量 URL 泄漏到 Google 的最大来源。它们动态生成、数量无限、彼此高度近似、更新速度比爬虫还快。Google 自己的文档说得很直接:默认情况下,站内搜索结果不该进索引。本文讲清这条规则、两个让它进索引反而能赚流量的例外,以及把已经泄漏进去的搜索 URL 干净清掉的具体步骤。
一句话结论
- 默认加
noindex。 在搜索模板里加<meta name="robots" content="noindex, follow">(或用X-Robots-TagHTTP 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 | 立刻省抓取预算 | 按模式整批 | 否——本身不会下架 |
干净的清理顺序:
- 在搜索模板里加上
noindex, follow,先把持久信号铺好。 - 在 Search Console 里打开 Removals → Temporary Removals → New Request,选「移除所有带此前缀的 URL」,填你的搜索路径(例如
https://yoursite.com/search?)。约 24 小时内匹配到的 URL 全部隐藏。 - 记住限制:临时移除大约只持续 六个月。是第 1 步加的
noindex在这个窗口过后让移除继续生效,所以别跳过。 - 接下来几周观察 Page indexing 报告变小,Google 重新抓取后会执行
noindex。 - 只有在
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 遵循同样的
noindex和robots.txt语义。主流爬虫行为一致。