站长常遇到一个困惑:明明在 robots.txt 里 Disallow 了某个目录,搜索结果里却还能看到这些地址。反过来,有时候加了 noindex,页面却迟迟不退出索引。这两个指令管的根本不是同一件事,混着用就容易出现上面两种情况。
两个指令解决的是不同问题
- Disallow:告诉蜘蛛“别来抓”。它控制的是抓取行为,属于 robots.txt 层面的约定。
- noindex:告诉蜘蛛“别把这一页放进索引”。它控制的是收录结果,但它写在页面上,蜘蛛必须先抓到页面才能看到。
一句话记:Disallow 管“来不来”,noindex 管“留不留”。而 noindex 生效的前提,是蜘蛛能来。
为什么被 Disallow 的页面还出现在结果里
常见原因有三类,可以先对号入座:
- URL 可以通过外链、sitemap、其他站点的引用被发现。即使蜘蛛没抓正文,也可能建立一个只有地址或标题的索引条目。
- 页面在被屏蔽之前就已经被抓取并收录了。抓取被挡住并不会自动删除已有的索引记录。
- 蜘蛛看到 Disallow 后选择不抓取,自然也读不到页面里的 noindex,于是“屏蔽”和“退出索引”两件事都没完成。
想让页面真正退出索引,顺序不能颠倒
- 先不要屏蔽抓取,确保蜘蛛能正常取到页面内容。
- 在页面上返回 noindex,用 meta 标签或 HTTP 响应头都可以。
- 等索引里的条目消失,期间保持页面可被抓取。
- 确认退出后,再考虑用 robots.txt 屏蔽,或者干脆让页面下线。
如果页面本身已经不需要存在,直接返回 410 或 404 通常更干净,不必绕这条链路。
几个容易踩的坑
- 屏蔽了 JS 或 CSS,而 noindex 是由脚本渲染出来的,蜘蛛看不到这个指令。
- 先 Disallow 再加 noindex,结果 noindex 永远没有机会生效。
- 用 X-Robots-Tag 做控制,但只对部分 UA 返回,测试环境和线上表现不一致。
- robots.txt 里的路径是前缀匹配,写 /private 会连带屏蔽 /private-page,需要写得更精确。
- 屏蔽了带参数的 URL,又指望用 canonical 把权重收拢,可蜘蛛抓不到页面,自然也读不到 canonical。
怎么验证是否真的生效
- 看索引状态:用站点维度的查询或索引报告,注意区分“已被屏蔽抓取”和“已抓取但未编入索引”两种状态,它们对应的问题完全不同。
- 看服务器日志:如果目标目录里再也看不到蜘蛛的访问记录,说明屏蔽起了作用;如果仍有访问,多半是规则写错了位置或语法有误。
- 单页排查:拿一个测试地址做对照,处理前后各记录一次状态,比只看总量更可靠。
和 sitemap、内链的配合
sitemap 里继续列着已经 noindex 的 URL 是自相矛盾的,确认退出索引后就应该清理。同样,站内链接如果一直指向准备下线的地址,蜘蛛会反复发现它,退出的过程也会更慢。想让一个页面安静地离开索引,除了指令本身,还要检查有没有别的地方在替它做宣传。
把“抓取”和“收录”分开想,很多问题就清楚了:要留住抓取、拿掉收录,用 noindex;要节省抓取、彻底不让来,用 robots.txt。两者顺序错了,指令就是在空转。