做站点运营的人常常把 robots.txt、noindex 和 canonical 当成同一类东西:都是“我不想让这个页面被收录”的工具。但三者在收录链路里作用的位置完全不同,用错位置不但达不到目的,还可能让本该收录的页面消失,或者让不想出现的页面继续留在索引里。
先记住一条链路:发现、抓取、索引
一个 URL 要出现在搜索结果里,大致要经过:蜘蛛发现这个地址、发起抓取拿到内容、判断内容是否值得进索引。三个指令分别卡在这条链路的不同环节上,混着用就容易互相打架。
robots.txt:管的是能不能抓
robots.txt 是抓取层面的约定,放在站点根目录,告诉蜘蛛哪些路径不用来抓。它独立于页面内容存在,所以蜘蛛在抓取之前就能读到。
这里有个经常被忽略的后果:被 robots.txt 挡住的 URL,并不会自动从索引里消失。如果这个地址通过外链、sitemap 或别的方式被蜘蛛知道,它可能仍然出现在索引中,只是没有摘要,结果页上显示的是一行光秃秃的链接。想彻底移除,必须让蜘蛛抓一次页面、读到 noindex 才行,而 robots.txt 恰好阻止了这次抓取。
robots.txt 适合用来节省抓取、挡住无意义的路径,不适合当作删除收录的手段。
noindex:管的是能不能进索引
noindex 写在页面层面,形式可以是 meta robots 标签,也可以是响应头里的 X-Robots-Tag。对 PDF、图片这类非 HTML 文件,只能用后者。
它的生效前提是蜘蛛能抓到这一页。所以当 robots.txt 和 noindex 同时指向同一个 URL 时,两者会互相抵消:抓不到,就读不到 noindex,索引里的旧记录也就一直留着。
还有两个细节值得注意:
- noindex 要放在能被解析的位置,靠脚本后期插入、或者只写在 iframe 里的,可能来不及被看到。
- 从索引里去掉之后重新放开收录,需要重新被抓取,节奏取决于站点整体情况,不会立刻回来。
canonical:管的是多个地址留哪一个
同一个内容常常有多个入口:带参数的、大小写不同的、列表页翻出来的。canonical 用来告诉搜索引擎,这些地址里哪个是主版本。
它和上面两个指令最大的区别是:canonical 是提示,不是命令。搜索引擎会结合内链、sitemap、外链指向和内容相似度,最终自己决定保留哪一条。你标了 A,它也可能留 B。
几种做法基本等于白标:
- canonical 指向一个已经被 noindex 的页面,两个信号互相矛盾。
- 每页都指向自己,但页面之间内容高度重复,等于没提供任何信息。
- canonical 指向另一个域名,跨站归并通常不会被采纳。
- canonical 指向 404,或者中间隔着好几跳重定向的地址。
三个指令怎么配合
按目的来选,而不是按习惯来选:
- 页面有价值,只是想换一个主地址:用 canonical 把重复版本指向主版本,不要用 noindex。
- 页面完全不需要出现在搜索里:用 noindex,同时确认它没有被 robots.txt 挡住。
- 这段路径只会消耗抓取、内容也没收录价值:可以考虑 robots.txt,但要接受它可能仍以无摘要形式留在索引里。
- 已经收录、现在想删掉:先撤掉抓取限制,让页面能被抓到并读到 noindex,等索引更新;紧急情况再用移除工具做临时处理。
一个简单的自查顺序
遇到某个页面“该收没收”或者“不该收却收了”,可以按下面的顺序看一遍:
- 先看 robots.txt 有没有挡住这个路径;
- 再看源码和响应头里有没有 noindex;
- 然后看 canonical 是否指向自己,指向的地址能不能正常访问;
- 最后确认这个 URL 有没有内链或 sitemap 入口,蜘蛛有没有理由发现它。
这四步走完,大部分“指令互相打架”的问题都能定位到。真正的难点往往不在标签本身,而在于站点里没人说得清这些标签是谁、为了什么给谁加上的。把每条规则的来源记下来,比事后一个个页面反查要省力得多。