先分清每个指令管的是哪一层
把抓取和索引分开看,很多冲突就不难理解。
- robots.txt:管抓取。它决定蜘蛛能不能把 URL 取回来,不决定页面是否出现在结果里。
- meta robots 的 noindex 或 X-Robots-Tag:管索引。蜘蛛必须先把页面抓回来,才能读到这条指令。
- canonical:管规范化。它是建议而不是命令,搜索引擎可以自行判断是否采纳。
- rel="nofollow" 与页面级 nofollow:管链接。前者作用于单条链接,后者作用于整页所有链接。
层级清楚了,冲突的大致顺序也就出来了:抓取层在前,索引层在后,规范化在两者之间做取舍。
几种常见的冲突写法
robots.txt 屏蔽加 noindex
这是最典型的一对。页面被 Disallow 后蜘蛛不会去抓,自然读不到页面里的 noindex。如果站内其他页面或外部站点仍然链接到这个 URL,它的地址仍有可能出现在结果里,只是没有摘要。想让页面彻底退出,通常要先允许抓取,让 noindex 被读到,等它退出之后再考虑屏蔽。
noindex 加 canonical 指向别处
页面上同时写 noindex 和一条指向其他 URL 的 canonical,两条信号方向相反:一条说不要这个页面,一条说这个页面的正式版本在另一个地址。实际处理时 canonical 往往被忽略,页面按 noindex 退出。如果本意是合并内容,应该只留 canonical;如果本意是删除页面,就该把 canonical 去掉或改成自指。
canonical 指向一个 noindex 页面
多个页面都把 canonical 指向同一个目标,而那个目标自己写了 noindex。这种情况下,合并过去的信号落在一个不参与索引的地址上,等于白做。排查时顺手打开目标页确认它的 meta robots,是个成本很低的习惯。
整页 nofollow 加关键内链
页面级 nofollow 会波及页面上所有链接,包括导航和正文里的站内链接。如果你用它只是想控制某些外链的权重传递,这个写法会连带减少站内 URL 的发现通道。更稳的做法是只对个别链接加 rel 属性。
一套从外到内的检查顺序
- 看 robots.txt 是否屏蔽了这个路径,以及是否有更长的规则被误写。
- 用日志或抓取工具确认蜘蛛最近一次访问的返回码,排除 403、503 这类被中间层拦掉的情况。
- 确认渲染完成后的 HTML head 里有没有 noindex,注意由脚本注入的指令是否真的出现。
- 检查 canonical 指向谁,目标页是否可索引、是否与当前页内容重复。
- 最后看链接属性:哪些内链带了 nofollow,站内是否还有别的入口能到达这个 URL。
指令之间不是互相抵消的关系,后写的不会覆盖先写的。它们作用在不同环节,冲突时各自在自己的环节生效。
写之前先问一句
每条指令背后最好只有一个目的。想禁止抓取就改 robots.txt,想退出索引就用 noindex,想合并重复内容就用 canonical。三种目的混在同一页上,通常说明页面的定位还没想清楚,先解决这个问题,比反复调整指令更省事。搜索引擎的规则会更新,涉及关键页面时建议对照官方文档确认当前行为。