指令为什么会互相打架
同一个页面上出现多套指令,通常不是有人故意为之,而是历史遗留叠加出来的:模板里带一份默认配置,编辑后来又加了 noindex,canonical 还是建站时写死的旧地址;或者站点迁移时只改了 HTML 标签,服务器响应头里的 X-Robots-Tag 还留在旧规则中。这些信号一旦矛盾,搜索引擎只能按自己的优先级挑一条执行,结果往往和运营的预期对不上。
所以遇到“明明写了 noindex 还在索引里”“canonical 指向 A,索引里却是 B”这类情况,先别急着怀疑算法,先把页面上实际输出的指令逐条列出来。
先把三类信号分开看
- 抓取类信号:robots.txt、服务端限流或防火墙、返回的状态码。它们决定爬虫能不能把页面内容取回去。
- 索引类信号:meta robots 里的 noindex、nofollow,以及 HTTP 响应头里的 X-Robots-Tag。它们决定内容取回之后要不要进索引。
- 规范类信号:link rel=canonical、sitemap 里登记的地址、内链指向。它们只是提示,用来表达哪一份才是主版本。
把这三类混在一起讨论,很容易得出错误结论。抓取被挡住时,索引类信号根本没机会被读到;而规范类信号本身不是强制指令,通常不会推翻索引类信号。
几组常见冲突,按这个顺序核对
noindex 与 canonical 同时出现
如果页面能被正常抓取,同时又带着 noindex,那么它一般不会保留在索引里,同一页上的 canonical 此时起不到转移作用。想用 canonical 把索引和权重归到主版本上,就应该让这个页面保持可索引,而不是一边 noindex 一边指 canonical。真正需要两件事同时成立时,更常见的做法是让副版本可抓取、可索引,用 canonical 明确指向主版本,再观察主版本是否被收录。
X-Robots-Tag 与 meta 标签不一致
响应头和 HTML 里都写索引指令时,一般以限制更强的一方为准。比如响应头写了 noindex、页面里的 meta 写 index,通常按 noindex 处理,反过来也一样。排查时不要只打开源码看 meta,用能带请求头的抓取工具或命令行确认服务端究竟返回了什么。
robots.txt 挡住抓取,页面上却写着 noindex
爬虫拿不到页面内容,也就看不到 noindex。这种情况下页面仍然可能因为外链或历史记录出现在结果里,只是缺少摘要和正文。要让它彻底离开,先放开抓取、让爬虫读到 noindex,或者干脆用 404、410 处理不再需要的地址。顺序搞反了,指令就等于没写。
落地的核对步骤
- 取一份真实的响应头,确认状态码、X-Robots-Tag 和完整的重定向链。
- 在渲染后的 DOM 里再看一遍 meta robots 和 canonical。不少站点是脚本注入的,源码里根本看不到。
- 对照 robots.txt,确认目标地址没有被规则误伤。
- 检查 sitemap 和内链是否把副版本当成主版本到处引用,这种自相矛盾会削弱规范化信号。
- 把指令、期望结果、当前观察到的索引状态记在同一张表里,改一项,观察一项。
几种容易写错的组合
- 页面已经 301 跳转,旧地址上还留着 noindex,指令基本没有机会被读到。
- canonical 指向一个本身不可索引的地址,等于把主版本交给一张空头支票。
- 分页、筛选页统一加了 noindex,同时又指望它们的内链帮助发现详情页。这两件事本身不矛盾,但不要再期待这些页面进索引。
- 同一套模板在不同目录里输出不同的规范地址,通常是配置分支没对齐。
指令冲突时,先确认爬虫能不能读到,再确认读到了哪一条。顺序错了,后面所有判断都会跟着偏。