很多站点在“不想让某个页面被搜到”的时候,第一反应是打开 robots.txt 加一条 Disallow。过几天去搜索结果里一查,URL 反而出现了,于是得出“robots 没用”的结论。问题通常不在工具本身,而在于把两件不同的事混成了一件:抓取和收录。
抓取和索引是两道关
抓取是搜索引擎派爬虫把页面内容取回去;索引是取回来的内容经过处理,进入可以被检索的库。挡住前一道,不等于挡住后一道。
- robots.txt 管的是“能不能来抓”。
- noindex(通常写在 meta robots 标签或 HTTP 响应头里)管的是“能不能进索引”。
robots.txt 里 Disallow 的实际效果
Disallow 掉一个 URL,爬虫通常不会去请求它,所以它看不到页面上写的 noindex。但如果这个地址被其他站点链接、被 sitemap 提交,或者被站内其他页面提到,搜索引擎仍然可能把它作为一个“知道存在、但没去过”的地址放进索引——展示形式可能是一条没有摘要的链接。
也就是说,robots.txt 能减少抓取,却不能保证 URL 从索引里消失。把它当成“删除开关”,期望往往会落空。
想让页面不进索引,正确做法是 noindex
前提是这个页面必须允许被抓取。如果同一路径既被 robots.txt Disallow,又写了 noindex,noindex 实际上不会生效,因为爬虫进不来,读不到这条指令。两者不要叠在同一个 URL 上,否则看起来是双保险,实际只有一层起作用。
其他几种常见的“挡住”手段
- 登录墙或权限控制:不登录看不到内容,爬虫同样看不到,页面可能仍被索引成一个入口,但没有正文。它适合内部系统,不适合希望被搜到的内容。
- canonical:它的作用不是阻止收录,而是告诉搜索引擎“多个相似地址里哪个是主版本”。用 canonical 去达到“这一页不要收录”的目的,通常会落空。
- 删除页面后返回 404 或 410:这是让已经进索引的页面退出的常规做法,410 表达更明确一些。
- 返回 403 或弹验证码:容易被视为“暂时访问不了”,索引里的旧内容可能留存一段时间,并不是干净的移除方式。
几个反复出现的误用
把“临时不想被搜到”和“永久不想被收录”用同一套配置处理,往往是多数事故的起点。
- 上线测试期间在 robots.txt 里 Disallow 整站,上线后忘记删掉,导致整站页面逐渐从索引里消失。
- 把 noindex 写在 robots 已经挡住的路径里,以为做了两层保险。
- 用 noindex 处理重复内容,而不是用 canonical 做版本归一,结果几个版本都没进索引。
- 临时遮罩用完后只删了页面上的标签,忘了服务器响应头里还有一条 noindex。
按目标选择手段的顺序
- 希望这个页面出现在搜索结果里——什么都不要加。
- 不希望,但以后可能还想让它被看到——用 noindex,并保留抓取。
- 不希望,也不想让它消耗抓取资源——robots.txt Disallow,但要接受 URL 可能仍以无摘要形式出现。
- 页面已经彻底不要了——让它返回 404 或 410,比一直遮罩更彻底。
改完配置之后,给自己留一段观察期。索引状态的更新不是即时的,从索引里移除往往比收录更慢。这段时间里,用服务器日志确认爬虫是否还来、请求返回什么状态码、命中的是哪条规则,比反复刷新搜索结果更有参考价值。