排查页面不收录时,大多数人的第一反应是打开 HTML 源码,确认有没有 noindex。但索引指令不止存在于页面里,它还可以写在 HTTP 响应头中。当两处指令不一致时,只看其中一处很容易得出错误结论。
两处指令,同一个字段
搜索引擎读取的 robots 指令有两个入口:
- 页面内:HTML 中的 meta robots 标签,只作用于 HTML 页面。
- 响应头里:X-Robots-Tag,作用于任何通过 HTTP 返回的资源,包括 PDF、图片、视频、接口文档等无法插入 meta 的文件。
两者内容格式基本一致,都支持 noindex、nofollow、noarchive、nosnippet 等指令,也可以限定只对某个搜索引擎 UA 生效。
冲突时以谁为准
关键结论是:指令是叠加的,不是互相覆盖的。同一个页面上,meta 里写 index、响应头里写 noindex,结果按 noindex 处理;反过来也一样。限制越严格的指令优先级越高。
同理,多个 X-Robots-Tag 响应头会逐条累加;同一行里用逗号分隔的多条指令也会一起生效。如果分隔符写错,某条指令可能被直接丢弃,这类细节最好实测确认,而不是凭记忆判断。
排查时不要问“哪一条指令生效”,而要问“所有指令加起来包含了什么限制”。
最容易漏掉的三类来源
1. 全站统一加的响应头
CDN、WAF、反向代理或某些缓存插件会默认给所有响应追加 X-Robots-Tag。配置一次,全站资源都可能带上 noindex。这类问题的特征是:页面内容正常、内链也是通的,但所有 URL 的收录状态异常一致。
2. 按目录或扩展名定向加的头
例如只对某个目录或 .pdf 结尾的请求加 noindex。此时首页、栏目页收录正常,某一批资源集体不进索引,很容易被误判成“内容质量不行”。
3. 不同 UA、不同节点看到的不一样
部分防护策略会对非浏览器 UA 返回不同的响应头,或者不同 CDN 节点缓存了不同版本的头。你本地拿到的是 A 版本,蜘蛛拿到的是 B 版本,两边结论自然对不上。
四步核对顺序
- 看原始响应头:用不缓存的方式请求目标 URL,确认返回头里有没有 X-Robots-Tag。命令行工具拿到的第一手响应,比“页面源码里没看到 noindex”更可靠。
- 对比 UA:分别用普通 UA 和搜索引擎 UA 请求同一个 URL,看响应头是否一致。不一致就说明中间有设备在做条件判断。
- 覆盖非 HTML 资源:把站内的 PDF、图片、文档按类型抽样,单独检查它们的响应头。这些文件没有 meta 可以兜底,只能靠头来控制。
- 看蜘蛛实际拿到的版本:在搜索后台的网址检查里查看已抓取的内容与抓取详情,确认蜘蛛当时收到的是哪个版本,而不是你现在能看到的版本。
两个边界提醒
一,响应头里的 noindex 需要蜘蛛真正抓取到才能被读到。如果同时用 robots.txt 拦住了抓取,指令就没有机会生效,这两件事要分开处理。二,把 noindex 去掉之后,恢复通常不是即时的,需要等下一次抓取与重新处理,不要因为当天没变化就反复改动配置。
把“页面里没有 noindex”扩展成“整条响应链路上都没有 noindex”,很多看起来莫名其妙的收录问题,往往能当场定位到源头。