在索引报告里看到一批本该被屏蔽的 URL,回头检查 robots.txt 明明写了 Disallow,这是不少人遇到过的场景。问题通常不在于规则写错了,而在于把“不允许抓取”和“不允许收录”当成了同一件事。
抓取和收录是两条独立的线
搜索引擎处理一个 URL,大致要经过几步:发现(从外链、sitemap、内链得知它存在)、抓取(取回内容)、索引(判断是否值得进入索引)、展示(在结果页出现)。robots.txt 只作用于第二步。
它可以明确告诉蜘蛛“这个路径不要来抓”。但蜘蛛依然可能通过其他渠道知道这个 URL 存在,比如别的网站链过来、曾经被抓取过、sitemap 或其他文件里出现过。这种情况下,蜘蛛不会去取内容,却可能只凭 URL 本身和外部信号,先放一条没有摘要的索引记录进去。
结果就是:屏蔽了抓取,却在结果页里看到一条只显示 URL、没有标题和描述的条目。这不是 robots.txt 失效,而是它的作用范围本来就不覆盖收录。
Disallow 之后,noindex 为什么会失灵
更常见的一种误操作是:先在 robots.txt 里写 Disallow,再在页面里加 noindex,以为这样是双重保险。实际效果往往相反。
noindex 是写在页面 HTML 里的指令,蜘蛛必须抓到页面才能读到它。如果 robots.txt 已经禁止抓取这个路径,蜘蛛根本进不来,也就看不到 noindex。两个指令叠在一起,等于把唯一可能让页面退出索引的通道堵死了。所以想用 noindex,就必须让这个 URL 保持可抓取。
不同需求该用哪种手段
- 只想省抓取资源、不介意是否收录:用 robots.txt。适合后台路径、无限参数组合、站内搜索结果页这类不需要进索引也无需精细控制的地址。
- 想让页面彻底不进索引:用 noindex,并保证该 URL 可以被抓取,robots.txt 里不要屏蔽它。
- 页面已经废弃、不再需要:返回 404 或 410,或者 301 到内容相近的新页面。这通常比 noindex 更干净。
- 内容敏感、不能外露:不要依赖 robots.txt,它只是约定。真正的做法是权限控制或直接下线内容。
已经进了索引的 URL 怎么处理
- 先确认这条记录属于哪种情况:是抓取过但被判断为低价值,还是从未抓取、只有一条 URL。前者看索引报告给出的原因,后者多半是外链造成的。
- 如果页面还需要存在但不该被收录:去掉 robots.txt 里的 Disallow,加上 noindex,等蜘蛛重新抓取后确认状态变化。
- 如果页面可以彻底消失:让它返回 404 或 410,同时清理指向它的内链,避免蜘蛛反复顺着链接过来。
- 如果内容已经搬到新地址:301 到新地址,并更新内链和 sitemap。
- 观察周期按周计,不要每天反复改动指令,否则蜘蛛每次抓到的状态都不一样,反而拖慢处理。
容易忽略的几个细节
robots.txt 的规则通常是前缀匹配,“Disallow: /search” 会同时挡住 /searching 这类路径,写规则时要留意边界。同一路径下不同参数、不同大小写的地址,在 robots.txt 里未必被同一条规则覆盖,需要分别确认。
还有一点:robots.txt 本身改错或返回 5xx 时,蜘蛛可能会在短期内放宽限制去抓取。所以改完之后,建议用抓取测试工具确认一遍规则是否按预期生效,再回头观察索引报告里的变化,而不是改完就当结束。
把这几件事分开看,思路会清楚很多:robots.txt 管的是“能不能来抓”,noindex 管的是“要不要留下”,404 和 301 管的是“这个地址还存不存在”。想移除一条收录,先问自己属于哪一种,再去选对应的手段。