先分清两条指令分别管什么
robots.txt 的 Disallow 管的是抓取,告诉爬虫不要来抓这个 URL;noindex 管的是索引,告诉搜索引擎即使抓到了,也不要把它放进索引。两者作用的环节不同,所以同时使用时,不一定得到“既不被抓、也不被索引”的结果。
关键点在于:如果 robots.txt 已经禁止抓取,爬虫通常无法读取页面上的 meta noindex,也看不到 HTTP 头里的 X-Robots-Tag。它只知道“这个 URL 被禁止抓取”,但并不知道你希望它不要索引。此时如果 URL 通过外链、历史记录或 Sitemap 被发现了,仍可能以“无摘要”的形式出现在索引里。
为什么会出现这种矛盾
常见路径是:页面先被收录,后来你在 robots.txt 里加了 Disallow,同时又在页面上加了 noindex。之后爬虫不再抓取页面,noindex 也就无法被重新读取。已经存在的索引记录可能长期停留,或者只保留一个 URL 占位,没有标题和描述。
另一种情况是页面从未被收录,但 URL 被大量外链指向。爬虫被 robots.txt 挡住,抓不到 noindex,URL 仍可能进入“已发现”甚至索引状态。此时你看到的是“屏蔽了但还能搜到”,实际上是两条指令没有按预期配合。
几种容易踩坑的写法
- robots.txt 用 Disallow 屏蔽目录,页面里又写 noindex。爬虫读不到 noindex,屏蔽只阻止抓取,不直接移除已有索引。
- 用 X-Robots-Tag 但服务器把响应头放在被屏蔽的路径下。同理,头部信息也无法被读取。
- 只加 noindex 却忘了检查 robots.txt 是否允许抓取。如果页面被 robots 屏蔽,noindex 不会生效。
- 把 noindex 写在 JavaScript 渲染后的 DOM 里。部分抓取场景下可能来不及执行,最好放在初始 HTML 的 head 或 HTTP 头中。
- 用 404/410 与 noindex 混用。如果页面确定要下线,直接返回 404/410 通常比 noindex 更明确;noindex 更适合保留页面但不希望被索引的场景。
建议的排查顺序
- 先确认这个 URL 当前在索引里的状态:是完全收录、只显示 URL,还是已经消失。
- 检查 robots.txt 是否 Disallow 了该 URL。如果屏蔽了,先决定:是要抓取后 noindex,还是直接下线返回 404/410。
- 如果希望 noindex 生效,需要先允许抓取,确保爬虫能读到页面 head 里的 meta robots 或 HTTP 响应头中的 X-Robots-Tag。
- 确认 noindex 的写法正确,例如 <meta name="robots" content="noindex">,不要写成 nofollow 或拼错属性。
- 观察一段时间,不要频繁改来改去。索引状态的更新需要时间,频繁切换信号反而让排查更困难。
更省事的处理原则
如果页面要彻底下线,优先考虑 404 或 410,并清理内链和 Sitemap;如果页面要保留但不参与搜索,使用 noindex,同时保证 robots.txt 允许抓取;如果只是不想浪费抓取预算,可以用 robots.txt 屏蔽,但要接受“URL 可能仍留在索引里且无摘要”的结果。三种目标对应三种工具,混用容易互相抵消。
把 robots.txt 当作“抓取开关”,把 noindex 当作“索引开关”。想让 noindex 生效,先别把抓取的路堵死。