做站点运营时,经常会遇到一个反直觉的现象:明明在 robots.txt 里把某个目录、甚至整个站都屏蔽了,搜索结果里却还能搜到这些页面。于是有人以为是 robots.txt 没生效,其实多数情况下它生效了——只是把“禁止抓取”和“禁止索引”当成了同一件事。
robots.txt 管的是抓取,不是索引
robots.txt 的定位是给爬虫划定可抓取范围,它告诉爬虫“这条路径你可以来,那条路径不要来”。但一个 URL 进入搜索索引,并不一定要靠爬虫把页面正文抓下来。搜索引擎可以从外链锚文本、URL 字符串本身、历史抓取记录,甚至页面被抓取后留下的副本中,判断这是一个存在的地址,并把它放进索引。
所以屏蔽抓取只能减少新内容被抓走,不能保证已有 URL 从索引里消失。反过来,一个页面被屏蔽抓取后,搜索引擎也拿不到你写在页面里的 noindex、canonical 等指令,等于关掉了沟通渠道。
常见的三种“屏蔽了还被收录”
一、只屏蔽了路径,没清理存量的索引
索引是历史积累的结果。你今天加的 robots 规则,只能影响之后的抓取行为,之前已经收录的 URL 仍然会留在索引里,直到搜索引擎重新评估并移除。这个过程可能很长,也可能因为外链持续存在而一直保留。
二、屏蔽写法有漏洞
- 只写了目录屏蔽,子域、参数版本、大小写变体仍在可抓范围内;
- Disallow 路径写错,比如少了斜杠或多了层级,实际没匹配到目标 URL;
- 规则被后写的 Allow 覆盖,尤其是路径较长时的匹配优先级。
三、页面本身不该出现在索引里
有些页面(测试页、内部搜索页、带 session 的地址)本来就不适合被收录。如果只靠 robots 挡住抓取,索引里照样可能保留一条没有摘要、没有正文的空壳记录,用户搜索时仍会看到链接。
想让页面退出索引,正确顺序是什么
- 先允许抓取。至少让爬虫能访问到你需要传递指令的那一层,否则 noindex 永远读不到。
- 在页面上给出明确的索引指令。HTML 页面用 meta robots 的 noindex,非 HTML 文件(PDF、图片、部分接口返回)用 X-Robots-Tag 响应头,两者不要互相矛盾。
- 确认响应状态正常。带 noindex 的页面应返回 200,如果返回 404 或 5xx,指令同样读不到。
- 等搜索引擎重新抓取并应用。可以用页面级检查工具确认指令是否被识别,再观察索引变化,不要当天改完就下结论。
- 如果页面确定要下线,改用状态码更直接。整站或整目录永久删除可用 410,临时下架可用 404,需要保留权重时用 301 指向新地址;这时再配合 robots 屏蔽,避免无效抓取。
几个容易踩的组合
- robots 屏蔽加 noindex 同时上:因为抓不到页面,noindex 白写,页面可能长期留在索引里。
- robots 屏蔽加 301:爬虫进不来,跳转规则无法传递,收效有限。
- 只删内链不改状态码:URL 仍是 200,索引没有理由移除它。
一句话原则:想控制抓取,用 robots.txt;想控制索引,用 noindex、X-Robots-Tag 或状态码。两件事分开做,顺序是先给索引指令、再限制抓取。
怎么验证有没有生效
服务端日志里看该 URL 是否还有抓取请求,能反映抓取层面是否被拦住;用页面级的索引状态检查看“是否允许索引”,能反映索引指令是否被读到;再定期用 site 查询或批量 URL 检查观察存量变化。注意 site 数量只是估算,别把它当成精确的收录数。
如果做完上面几步,索引里仍有残留,优先排查外链、镜像站点和参数版本,而不是继续加 robots 规则。屏蔽得越狠,沟通渠道越少,处理周期反而越长。