在日志或站长工具里看到某个目录已经被 robots.txt 的 Disallow 挡住,很多人的第一反应是“这部分内容不会再出现在搜索结果里”。过一段时间去搜,发现其中几条确实还在。于是开始怀疑 robots 规则没生效。问题通常不在生效与否,而在于把“禁止抓取”和“禁止索引”当成了同一件事。
抓取和索引是两个独立环节
搜索引擎处理一个 URL 大致分两步:先抓取页面内容,再根据内容判断是否放进索引。robots.txt 的 Disallow 作用在第一步,它告诉爬虫不要来取这个 URL 的响应体。但索引的素材来源并不只有抓取这一条路。
当外部站点链接到这个 URL 时,链接本身的地址、锚文本、周边上下文都会进入搜索引擎的视野。即使爬虫从来没取到页面内容,它也可能凭这些信息生成一条结果:标题可能是 URL 本身或外链锚文本,摘要可能来自链接周围的文字。这类结果常被误认为“robots 失效了”,实际上是索引用了抓取之外的信息。
noindex 生效的前提是页面能被抓到
noindex 写在页面的 meta robots 标签里,或者放在响应头的 X-Robots-Tag 中。无论哪种形式,爬虫都必须先把页面抓下来,才能读到这条指令。如果同一个 URL 既被 Disallow 又带 noindex,爬虫被挡在门外,读不到 noindex,索引状态自然不会有变化。这是最常见的一种冲突写法。
下架单个页面的操作顺序
- 先确认页面当前可被抓取:robots 规则不挡它,访问返回 200,没有被登录墙、验证码或地理限制拦在外面。
- 加上 noindex,保持页面可访问一段时间。
- 等搜索引擎重新抓取并识别到 noindex,观察索引中的该 URL 是否逐步减少。
- 确认基本消失后,再决定是继续保留 noindex,还是用 404、410 或重定向做后续处理。
顺序颠倒过来,先 Disallow 再想加 noindex,中间的等待时间会被拉长很多,因为爬虫根本没有机会读到新指令。
只想省抓取消耗,可以只用 Disallow
并非所有被挡的 URL 都需要清理索引。有些目录本来就不介意是否被收录,只是不希望爬虫反复来抓,比如无穷尽的筛选组合、内部日志页、临时导出链接。这种情况下只写 Disallow 是合理的,目的是把抓取配额集中在有价值的页面上。
判断标准可以归纳成两句话:不希望它出现在结果里,用 noindex 并保证可抓;不在乎是否收录、只想减少抓取,用 Disallow。两者混用时,先想清楚哪个目的优先。
排查时该看什么
- robots.txt 中针对该路径的具体规则,注意通配符与 Allow 的优先级,以及是否被上层目录的规则覆盖。
- 页面的 HTTP 状态码,以及响应头里是否存在 X-Robots-Tag。
- 页面源码中的 meta robots 是否与响应头指令冲突。
- 站长后台的抓取统计与索引状态,看最近一次抓取时间和抓取结果。
- 是否存在登录墙、地域限制、JS 渲染失败等导致内容拿不到的情况。
被大量外链指向的 URL 更要谨慎
如果一个 URL 有较多外部链接,处理节奏会更慢。搜索引擎知道它存在,可能长期保留一条信息不完整的结果。想让这类 URL 彻底退出索引,需要在可抓取的前提下返回 noindex,或者用 404、410 明确表态,然后等外链自然衰减。单纯加 Disallow 往往只是让爬虫不再更新这条信息,结果反而更旧。
robots.txt 是抓取指令,不是收录开关。想让内容不进入索引,靠的是 noindex;而 noindex 要起作用,页面必须能被抓到。两个开关用反了,规则会互相抵消。
遇到“明明挡了却还在”的情况,先别急着改规则,把目的写清楚:是要它消失,还是只是不想被抓。目的不同,用的工具和验证周期都不一样。