抓取和收录是两个不同环节。不少站点想屏蔽某个目录时,第一反应是在 robots.txt 里写一条 Disallow,过一阵子再看,这些页面仍然出现在搜索结果里,只是标题和摘要看着不太对。问题往往不在收录系统,而在于指令用错了对象。
两个指令各自管什么
robots.txt 告诉爬虫哪些路径可以访问、哪些不要访问,它限制的是抓取行为,本身并不直接决定页面能不能进索引。noindex 则不同,它通常写在页面的 meta robots 里,或者放在响应头的 X-Robots-Tag 中,意思是“这个页面抓到了,但请不要放进索引”。前提是爬虫能实际抓到页面并读到这条指令。
一句话概括:抓取是进门,索引是登记。挡在门外,登记处自然收不到你的说明。
为什么 robots.txt 常常挡不住收录
当一个 URL 被 robots.txt 禁止抓取,爬虫拿不到页面正文,也就看不到页面里的 noindex。此时如果有外链或其他来源指向这个 URL,它仍可能被索引,只是索引里缺少正文,可能只显示标题、网址或少量可见文字。另一种情况是页面此前已经被收录,之后加上 Disallow,索引中的旧版本还会保留一段时间,不会立刻消失。
容易用反的几种情况
- 想彻底移除页面,却只在 robots.txt 里写了 Disallow,页面本身仍是 200 且没有 noindex。
- 想屏蔽一批低价值页面,既加了 noindex,又用 Disallow 挡了整个目录,结果 noindex 根本读不到。
- 用 Disallow 屏蔽参数或目录,但该目录下其实有希望被收录的页面。
- 一边在 robots.txt 里封禁某些路径,一边还在 sitemap 中提交这些 URL。
下线一个页面的推荐顺序
- 先判断意图:是彻底不要这个页面,还是只是不想被搜索展现。彻底不要就删除并返回 404 或 410;只想不进索引就用 noindex。
- 如果选了 noindex,确认该 URL 没有被 robots.txt 挡住,让爬虫能正常抓到并读到指令。
- 移除站内指向该页面的链接,减少爬虫反复发现它的机会。
- 对已经收录的页面,可以在站长平台提交移除请求,缩短旧结果在索引中停留的时间。
- 留出一段观察期,确认索引中的旧结果处理完毕,再做下一步动作。
Disallow 加 noindex 通常不是“双保险”,而是无效组合:爬虫被挡在门外,读不到 noindex,页面状态往往维持原样。
非 HTML 资源改用 X-Robots-Tag
PDF、图片、视频这类文件没法在文件内部写 meta 标签,需要在 HTTP 响应头里加 X-Robots-Tag 来实现类似 noindex 的效果。如果这类资源只靠 robots.txt 屏蔽,同样可能出现没被抓取、却仍出现在索引里的情况。
canonical 和 noindex 别叠在一起
有的页面同时写了 canonical 指向另一个地址和 noindex。两个信号指向不同,取舍时容易产生不确定性。想把内容合并到另一个页面,用 canonical;想从索引中移除,用 noindex 并让页面返回合适的状态码,一般不需要两者并存。
动手前的自查清单
- 目标 URL 在 robots.txt 中是否被允许抓取
- 页面或响应头里是否写了 noindex
- 页面的 HTTP 状态码是否符合预期(200 / 404 / 410)
- sitemap 中是否还留着已下线的 URL
- 站内链接与外部链接是否还指向该 URL
指令本身并不复杂,麻烦多半来自把它们用在了同一件事上。先确定要达成的是“不被抓取”还是“不进索引”,再挑对应的工具,多数冲突都能提前避开。