把一批页面写进 robots.txt 的 Disallow 之后,过一阵去搜,发现它们还挂在索引里,这是很常见的困惑。原因其实不复杂:robots.txt 限制的是抓取,不是索引。地址一旦被拦在门外,蜘蛛就看不到页面上的 noindex 声明,只能维持原来的判断。
先分清抓取、索引与展现三层
- robots.txt:入口管控,告诉爬虫哪些地址不必来抓。
- noindex(meta 标签或 X-Robots-Tag 响应头):可以来抓,但不要放进索引,必须被成功抓取才能读到。
- 404 / 410:页面已不存在,是下线的自然信号。
- canonical:说明当前地址只是副本、正主在别处,属于合并信号,不等于删除。
可以这样记:想让一个地址从索引里退出,得先让蜘蛛进得来、看得见“别收录”的声明。先把门锁上,声明也跟着被锁在屋里了。
为什么屏蔽之后反而更难下线
已收录的地址被 Disallow 之后,爬虫通常不会再请求它,也就读不到之后新增的 noindex,页面状态容易停在旧版本上。更麻烦的是,如果这个地址还被站内链接、sitemap 或外链指向,蜘蛛依然能知道它存在,只是不进去看,索引里的旧快照就可能长期不动。
还有一种情况:为了减少服务器压力而整目录屏蔽,结果目录里那些本该下线的页面既抓不到也删不掉,只能等着慢慢过期。
内容下线时的推荐顺序
- 先确认页面属于哪一类:彻底删除、迁到新地址,还是保留但不想被搜到。
- 如果是保留但不希望被索引:先撤销对它的 robots.txt 屏蔽(至少允许该地址被抓取),再加上 noindex。
- 如果是彻底删除:让地址返回 404 或 410,不要让 200 加空内容、或跳到一个无关页面来顶替。
- 如果内容已迁走:用 301 指到新地址,并确保旧地址没有同时挂着 noindex。
- 从 sitemap、站内导航、相关推荐里撤掉指向该地址的链接,减少它被反复发现的机会。
- 过一段时间再检查索引状态,确认旧地址确实退出后,才考虑把 robots.txt 的屏蔽加回去。
几个高频误会
以为屏蔽等于删除
屏蔽只是不欢迎来抓,索引里已有的记录不会因此自动消失。想让它消失,要么明确 noindex,要么让地址真实返回 404 / 410。
noindex 和 Disallow 同时开着
两者同时存在时,屏蔽往往先起作用,noindex 反而读不到。要么只屏蔽、接受它可能长期留在索引里;要么先允许抓取、用 noindex 完成下线,两者不要叠在一起处理同一个地址。
整站屏蔽后再想放开
测试站或临时屏蔽整站之后忘记撤销,会让正常页面一起从索引里淡出。恢复时按目录或按环境逐条放开,比一次性全开更容易观察影响。
noindex 写在脚本里
如果 noindex 依赖前端脚本注入,抓取和渲染任何一环没跟上,声明都可能读不到。能放在 HTML head 或响应头里的,就放在那里。
动手前的自查清单
- 目标地址是否同时被 robots.txt 屏蔽和 noindex 声明覆盖?
- 是否需要放开抓取权限,noindex 才可能生效?
- sitemap、站内链接、结构化数据里是否还留着该地址?
- 删除的页面返回的是 404 / 410,还是 200 的空壳?
- 被其他域名镜像或转载的版本,是否需要单独处理?
把这些顺序理清之后,下线动作会变得可预期:先判断页面去留,再决定用哪种信号,最后才是收紧抓取权限。顺序反了,信号就传不到。