指令為什么會互相打架
同一個頁面上出現多套指令,通常不是有人故意為之,而是歷史遗留叠加出来的:模板里带一份預設配置,編輯後来又加了 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,同时又指望它們的内鏈帮助發現詳情頁。這两件事本身不矛盾,但不要再期待這些頁面進索引。
- 同一套模板在不同目錄里輸出不同的規范地址,通常是配置分支没對齐。
指令冲突时,先確認爬虫能不能讀到,再確認讀到了哪一條。顺序错了,後面所有判断都會跟着偏。