在抓取与索引这条链路上,robots.txt 和 meta robots(以及响应头里的 X-Robots-Tag)经常被当成同一类工具使用。它们管的环节其实不一样:robots.txt 决定蜘蛛能不能把 URL 抓回来,meta robots 决定抓回来之后要不要放进索引。把这两件事混在一起,就会出现“明明屏蔽了,结果里还有”和“明明写了 noindex,页面还是被收录”这类反复出现的困惑。
两条指令分别在哪个环节生效
Disallow 作用在抓取层面。蜘蛛先请求 robots.txt,读到规则后就不去请求对应路径。因为不请求,页面内容、页面里的 meta robots 标签、响应头里的 X-Robots-Tag,蜘蛛都没机会读到。所以 Disallow 并不等于“从索引中删除”,它只是让蜘蛛无法确认这个 URL 当前的状态。
noindex 作用在索引层面。蜘蛛必须先把页面抓下来,才能读到这条指令,然后决定不把它放进索引。也就是说,noindex 生效的前提是允许抓取。这两条指令的先后关系,决定了大多数配置错误的方向。
最常见的两种错配
用 Disallow 挡住不想被索引的页面
如果目的只是“这个页面不要出现在搜索结果里”,更稳的做法通常是允许抓取加上 noindex。改成 Disallow 之后,蜘蛛读不到 noindex,而页面又可能因为外链、历史记录或其他站点的引用,继续以 URL 的形式出现在结果中,标题和摘要则来自别处的信息。等到想收尾的时候,反而更麻烦。
给 noindex 页面同时加上屏蔽
这是上一种情况的镜像:页面里写着 noindex,robots.txt 里又把路径屏蔽了。结果是蜘蛛根本读不到 noindex,这条指令等于没写。如果 robots.txt 和页面模板由不同的人维护,这种冲突很容易悄悄存在很久,谁也不觉得有问题。
顺带屏蔽 CSS、JS 和图片的代价
robots.txt 里一条宽泛的规则,比如屏蔽某个目录下所有 js、css,看起来只是省流量,实际会影响渲染与判断。蜘蛛需要拿到样式和脚本,才能看清渲染后的结构和其中的链接;拿不到时,它对页面的理解会退回到原始 HTML,依赖脚本插入的内链、异步加载的内容都可能漏掉。图片、字体的抓取同样关系到它对页面完整度的判断。如果只是不想让某些资源出现在图片搜索里,用针对性更强的规则或指令,比整目录屏蔽更可控。
非 HTML 文件的指令放在哪里
PDF、图片、音视频这类文件里写不了 meta 标签,控制方式要放在 HTTP 响应头,用 X-Robots-Tag。它的取值和 meta robots 基本一致,可以带 noindex、noarchive、nosnippet 等。同一份内容既有 HTML 版又有 PDF 版时,两处的指令要一起看,否则容易出现某一个版本还在索引里的情况。
从抓取预算角度看屏蔽规则
- 被 Disallow 的 URL 如果还留在站点地图里,等于同时发出两个相反的信号,蜘蛛会反复来确认规则,却不产生有效抓取。
- robots.txt 中可以写 Sitemap 位置,这一行和屏蔽规则并不冲突,值得保留。
- 筛选、排序、分享追踪这类参数路径,适合整段屏蔽,减少蜘蛛在大量组合上消耗的时间。
- 屏蔽规则要写具体路径,避免一条过于宽泛的规则把站点地图、栏目页一起关掉。
- 后台、购物车、登录后页面这类不需要索引、也不影响前端展示的路径,屏蔽掉通常没有副作用。
可以照着核对的一组检查
- 列出 robots.txt 里所有 Disallow 规则,逐条确认屏蔽目的:是省抓取,还是不想被索引。
- 对“不想被索引”的页面,确认它们能被抓取,并且页面或响应头里确实有 noindex。
- 确认 CSS、JS、图片没有被整目录屏蔽,尤其是导航和首屏相关的资源。
- 检查站点地图中是否包含被屏蔽的 URL,把这个矛盾清掉。
- 改动后按目录分批观察日志与索引状态,不要一次性大范围调整。
robots.txt 决定蜘蛛走不走这条路,noindex 决定走到之后要不要留下。把这两句话分清,大部分“屏蔽了还在”和“写了没生效”的问题都能自己定位。