这是蜘蛛池和站点运营里很常见的一个混淆点:不少人把“页面不被收录”和“页面里的链接不被抓取”当成同一件事。实际上这是两个独立环节,X-Robots-Tag 只处理前者。
先分清:索引和链接发现是两回事
蜘蛛抓到入口页之后,会做两件不同的事:
- 链接发现:解析 HTML,把页面里的可解析链接提取出来,放进待抓取队列。
- 索引:决定这个 URL 要不要进入搜索结果,以及以什么形式出现。
X-Robots-Tag: noindex 的指令对象是第二条。它表达的是“别把我这个 URL 放进索引”,并没有说“不要读我页面里的链接”。所以从这个角度看,入口页被标记 noindex,并不会直接切断里面目标链接的发现路径。
noindex 和 nofollow 是两种指令
真正会阻断链接跟进的是 nofollow。三种常见写法的差别很大:
- X-Robots-Tag: noindex —— 当前 URL 不进索引,页面里的链接照常被解析和排队。
- X-Robots-Tag: nofollow —— 不跟随当前页面里的链接。
- X-Robots-Tag: noindex, nofollow —— 两条同时生效,入口页里的目标链接基本不会通过这个入口被发现。
如果入口页本身不打算参与排名,只加 noindex 就够了,不要顺手再补一个 nofollow,否则等于亲手把入口掐掉。
为什么有人感觉“加了 noindex 蜘蛛就不来了”
常见原因往往和 noindex 的直接作用无关:
- 日志误读。蜘蛛其实抓过入口页,但时间窗没对上、IP 段没识别出来,或者只看了访问量而没看来源。
- 抓取频次变化。站内长期堆积大量 noindex 页面,整体若被判断为价值较低,抓取预算会收紧,间接拖慢目标 URL 被发现的节奏。
- 排查不完整。实际生效的是 nofollow、robots.txt 屏蔽或响应头被 CDN 覆盖,但只盯着 noindex 看。
- 目标 URL 自身有问题。返回 404、5xx、需要登录、被 robots.txt 屏蔽,都属于“发现了但抓不到”。
怎么验证链接是否真的被跟进了
- 先看入口页这一侧:用 curl -I 确认真实返回头里到底是哪条指令,别只翻源码里的 meta 标签。
- 再看目标 URL 这一侧:日志里有没有对应的蜘蛛请求,时间点是否落在入口页被抓之后。
- 跨域链接要单独确认:href 写成可解析的完整地址,没有 rel=nofollow,也不是靠点击事件触发。
- 在搜索后台的抓取统计里观察目标 URL 是否进入过抓取队列。
几个容易忽略的细节
- X-Robots-Tag 是响应头,CDN、反向代理、后端框架任意一层都可能追加或覆盖它,排查时以线上真实响应为准。
- meta robots 和 X-Robots-Tag 同时出现时,通常更严格的那条生效。比如源码写 index、响应头写 noindex,结果一般按 noindex 处理。
- 入口页返回 4xx 或 5xx 时,蜘蛛连页面主体都拿不到,这时讨论 noindex 已经没有意义。
- noindex 页面仍然可以被其他页面链接并作为中转,它的“通道”角色并不受影响。
把 noindex 理解成“这个 URL 别进索引”,而不是“这个 URL 别被抓”,很多排查方向自然就顺了。
实操上的建议
入口页如果本来就不打算参与排名,加 noindex 是相对干净的做法;但要让里面的目标 URL 有机会被发现,就别在同一层加 nofollow,也别用 JS 跳转、iframe、隐藏元素去替代正常的 a href。真正决定目标 URL 会不会被抓的,是链接是否以可解析形式存在、目标地址本身是否可访问,以及整站抓取预算是否够用。
另外提醒一句:链接被发现只是进入队列的第一步,后面还有抓取调度和内容层面的判断,发现了不等于一定会被抓,也不等于会在某个时间点出现。