想从一个网站里拿掉某个页面,很多人的第一反应是两个操作一起上:robots.txt 里 Disallow 掉,页面里再加一个 noindex。看起来是双保险,实际结果经常是页面在索引里挂了好几个月,甚至在搜索结果里还能看到标题和链接。
抓取和索引是两道独立的门
要理解这个问题,先分清两个动作各自在管什么。
- 抓取:搜索引擎把页面的 HTML 拿回去。robots.txt 里的 Disallow 管的是这一步。
- 索引:把抓回来的内容判断、处理、存进索引库。noindex 管的是这一步。
关键在于,noindex 是写在页面里的一个 meta 标签。搜索引擎必须先抓到页面,才能读到它。如果 robots.txt 已经明确禁止抓取这个 URL,爬虫通常就不会去取内容,自然也读不到那句 noindex。
Disallow 加 noindex 会发生什么
这是最常见的一类「下线失败」。
搜索引擎的视角
爬虫来到这个 URL,被 robots.txt 拦住,不抓正文。但它此前可能已经从别的地方知道了这个地址——外链、sitemap、内链、历史记录都算。于是这个 URL 仍然可能被放进索引,只是拿不到摘要,展示成一条光秃秃的链接,或者标注「由于该网站的 robots.txt 文件,我们无法提供该页面的具体描述」。
你看到搜索结果里还有这个页面,以为 noindex 没生效,其实是它根本没被读到。
另一个容易忽略的点
有些站长在 robots.txt 里用通配符拦了一整个目录,然后指望目录下所有页面的 noindex 生效。结果是这一批页面全部处在「被拦住、又可能被索引」的状态,处理起来更麻烦。
想真正下线一个页面,顺序应该反过来
- 先确保这个 URL 允许被抓取,不要用 robots.txt 挡住它。
- 在页面里放 noindex,或者返回 X-Robots-Tag: noindex 响应头。
- 等爬虫重新访问并读到 noindex,页面从索引中移除。
- 确认已经移除之后,再决定要不要在 robots.txt 里加 Disallow。
顺序颠倒,就是前面说的僵局:拦住了抓取,也就拦住了 noindex 生效的唯一途径。
几种常见写法的自查
- meta 写法要完整:<meta name="robots" content="noindex">。只写 noindex 时默认仍允许跟踪链接;如果同时不想让爬虫顺着链接走,用 noindex, nofollow。
- 如果页面是通过 301 跳到别处,通常不需要再写 noindex,跳转本身会推动旧 URL 退出索引。
- 非 HTML 资源(PDF、图片、视频)没法写 meta,要用 X-Robots-Tag 响应头。
- 检查有没有互相打架的标签:一个说 noindex,另一个从模板继承来 index。最终以更严格的那个为准,但值得把冲突清理掉。
- 分页、筛选参数这类不想被索引的 URL,同样优先考虑 noindex 而不是 Disallow,除非你确实不希望搜索引擎去抓。
什么时候 Disallow 才是对的
当你不介意 URL 出现在索引里、只是不想让爬虫浪费抓取配额时,Disallow 是合适的选择。比如后台路径、站内搜索结果页、大量无意义的参数组合。这类页面的目标是「别来抓」,而不是「从索引里删掉」。
一句话区分:想让页面消失,用 noindex;想让爬虫别来,用 Disallow。两者同时用,等于让 noindex 永远送不到。
改完之后的观察点
改完不要立刻下结论。索引更新有周期,尤其是访问量低、外链少的页面,重访间隔可能很长。可以做的几件事:
- 用抓取检查工具看当前抓到的 HTML 里,robots meta 到底是什么值。
- 确认 robots.txt 没有再拦这个 URL。
- 如果涉及页面数量多,用 sitemap 或内链引导爬虫重新访问,加快重读。
- 看服务器日志里这个 URL 的返回状态和响应头,确认服务端没有额外下发冲突的指令。
页面是否收录,最终由搜索引擎决定,我们能做的是把信号给清楚、别自相矛盾。把抓取和索引这两件事分开处理,很多「删不掉的页面」其实只是指令顺序写反了。