站点的站内搜索结果页往往会产生大量带参数的地址,比如 /?s=关键词、/?keyword=xxx。这类页面数量近乎无限、内容质量低、而且互相重复,是 SEO 里典型的「抓取预算黑洞」。要处理它们,有两条常见路径:在 robots.txt 里 Disallow,或者给页面加 noindex。这两者效果不同,选错会导致页面仍然出现在搜索结果里。
两者的作用点不同
Disallow 控制的是抓取:告诉爬虫「不要来抓这个地址」。
noindex 控制的是索引:告诉爬虫「抓到了也不要收录这个页面」。
这个区别看起来细微,后果却很实际。一个页面被 Disallow 之后,爬虫不会去抓取它,因此也就看不到页面里的 noindex 标签——即使你写了 noindex 也不会生效。反过来,一个页面可以被抓取但标了 noindex,爬虫会抓取它、看到标记、然后把它从索引里移除。
所以这两者不能同时用于同一个页面并且期望叠加效果。如果页面上有 noindex,就不要在 robots.txt 里 Disallow 它;如果 Disallow 了,页面里的 noindex 就白写了。
为什么 Disallow 拦不住收录
一个常被误解的点是:Disallow 之后页面就完全不会出现在搜索结果里了吗?
答案是不会。被 Disallow 的页面仍然可能被收录。
原因在于搜索引擎获取 URL 的渠道不止抓取。外部链接指向这个地址、sitemap 里列了这个地址、其他页面链接到它,都会让搜索引擎知道这个 URL 存在。即使它不去抓取内容,也可能把这个 URL 收录进索引——只是因为没有内容可读,搜索结果里显示的会是一条没有摘要的条目,或者显示一段占位文字。
对于站内搜索结果页来说,这种情况尤其容易发生,因为这类页面经常被用户复制链接分享出去,形成外部链接。
所以如果目标是「彻底不让这些页面出现在搜索结果里」,正确做法是让页面可以被抓取,但在页面里输出 noindex。
该怎么选
按目标来选。
如果目标是节省抓取预算,希望爬虫别把时间花在这些页面上,用 Disallow。这是 robots.txt 的强项——它直接告诉爬虫「不用来」,能有效减少无效抓取。
如果目标是让页面不出现在搜索结果里,用 noindex。这是 noindex 的强项,它控制的是索引结果。
如果两个目标都有,需要权衡:Disallow 能省抓取预算,但拦不住收录;noindex 能拦收录,但需要爬虫先抓一次。实践中,对于站内搜索结果页这类「数量多、价值低」的页面,多数站点的选择是 Disallow 优先,接受少量页面可能被收录的风险。
实施时的注意事项
无论选哪种方式,有几个细节需要处理。
第一,noindex 要作用在正确的页面范围。如果用模板统一输出 noindex,要确认它不会误伤正常内容页。常见的做法是按 URL 参数判断——带搜索参数的输出 noindex,不带参数的正常输出。
第二,分页页面不要轻易 noindex。列表页的第 2 页、第 3 页通常是有价值的(用户可以浏览、搜索引擎可以顺着发现深层内容)。对这些页面,正确做法是保留 index 并设置正确的 canonical,而不是一律屏蔽。
第三,canonical 与 noindex 不要冲突。如果一个页面同时声明了 canonical 指向别的地址,又输出 noindex,信号是矛盾的——搜索引擎可能不知道该听哪一个。noindex 页面通常不需要 canonical,或者 canonical 指向自己。
第四,改完之后要观察效果。搜索引擎处理 noindex 需要时间,页面从索引里移除可能需要几天到几周。可以通过搜索资源平台查看索引状态的变化,确认规则生效。
一个常见组合
对于站内搜索页这类场景,比较稳妥的组合是:
在 robots.txt 里用通配符拦住主要的搜索参数形式,减少抓取;同时在页面模板里对这类参数输出 noindex,处理那些已经被收录的历史页面。
前者控制增量(新产生的页面不会被抓取),后者处理存量(已收录的页面逐步被移除)。两者配合,覆盖了「节省预算」和「清理索引」两个目标。
需要注意的是,因为 Disallow 会阻止抓取,页面的 noindex 在 Disallow 生效后就不会被读到了。所以更严谨的顺序是:先让 noindex 生效、等页面从索引里移除,再上 Disallow 规则。这样能避免「页面被收录但没法通过 noindex 移除」的尴尬状态。
检查清单
- Disallow 控制抓取,noindex 控制索引,作用点不同
- 页面被 Disallow 后爬虫不会抓取,页面里的 noindex 也就不会被读到
- 被 Disallow 的页面仍可能因外部链接而被收录,只是没有摘要
- 目标是节省抓取预算用 Disallow,目标是移出索引用 noindex
- 两者都要时,先让 noindex 生效移除索引,再上 Disallow 规则
- 注意 noindex 的适用范围、分页页面的处理,以及与 canonical 的冲突