搜尋抓取

canonical 指向的地址,蜘蛛真的會照着走吗

canonical 常被当成指路牌,但它只影响收錄归属,不改變蜘蛛的抓取路径。本文解释為什么内鏈、Sitemap 與 canonical 不一致时,蜘蛛仍會走另一個地址,並列出几項可以直接自查的要点。

搜尋抓取

canonical 指向的地址,蜘蛛真的會照着走吗

很多站点把 rel=canonical 当成一块指路牌,以為在頁面里寫上目标地址,蜘蛛就會只抓那一個 URL。實际對照日誌时经常是反過来的:canonical 寫明了 A,蜘蛛却仍在 B 上频繁出現。

原因不复杂。canonical 是一個合並信号,用来告诉搜尋引擎多個地址中哪個代表正文,它並不改變蜘蛛怎么走。蜘蛛走的是連結,你内鏈指到哪、Sitemap 列了哪、外鏈落在哪,它就往哪走。

canonical 是提示,不是轉向指令

和 301 不同,canonical 不會让蜘蛛停止抓取目前 URL,也不會把抓取請求强制轉到目标地址。蜘蛛仍然會抓目前的 B 頁,讀出 canonical 里的 A,再把 A 当作正文归属。也就是说:抓取路径由連結决定,收錄归属才受 canonical 影响。

如果 B 是被大量内鏈指向的那個地址,抓取预算就會持續消耗在 B 上;A 反而可能因為缺少入口而長期不更新。

几種常见的指向不生效

内鏈指向的不是 canonical 地址

導航、列表、面包屑、相關推荐如果都寫着带參數的版本,例如带 from=list 這類标记的地址,蜘蛛自然會把參數版当成主入口,canonical 里的干净地址反而成了缺乏連結的頁面。合理的處理顺序是:先把内鏈统一到目标地址,再谈 canonical。

Sitemap 與 canonical 不一致

Sitemap 是蜘蛛發現 URL 的重要入口。如果 Sitemap 里躺着參數版、舊版、大小寫不一致的地址,就等于在和 canonical 唱反調。較稳妥的做法是:Sitemap 只列 canonical 地址,並保證這些地址返回 200、能正常渲染。

canonical 指向了會跳轉或报错的地址

canonical 的目标如果本身就是 301、302,或者返回 404、5xx,蜘蛛需要多走几步才能確認归属,有时干脆無法確認。服務器不稳定时,目标地址間歇性超时,合並信号會變得很模糊。canonical 指向的地址,最好是一個稳定、可直接訪問、返回 200 的 URL。

分頁頁面的 canonical 全部指向第一頁

把第 2、3 頁的 canonical 统一指向列表第一頁,是一種常见寫法。它的後果是:蜘蛛從第 1 頁沿分頁連結走到第 5 頁,每頁却都告诉它正文在第一頁。時間一長,深處詳情頁的發現路径會變窄。分頁更适合自引用 canonical,让每頁代表自己。

與 noindex、hreflang 互相打架

canonical 指向 A,同时頁面又寫 noindex,或者 hreflang 把 A 指回 B,几種信号會互相抵消。遇到冲突时,蜘蛛通常選擇更保守的處理方式,结果是该抓稳的没抓稳,该合並的没合並。多語言站点尤其要注意:hreflang 指向的地址應当與 canonical 保持一致。

自查时可以先看這几項

  1. 站内連結是否都指向 canonical 地址,有没有残留的參數版入口。
  2. Sitemap 里的 URL 與 canonical 是否一一對應。
  3. canonical 目标是否返回 200,而不是靠重定向才能到達。
  4. 是否存在 canonical 鏈,A 指 B、B 又指 C,尽量一步到位。
  5. 頁面里是否只出現一個 canonical 标簽,脚本注入的版本是否與 HTML 中的冲突。
  6. 用服務器日誌核對:蜘蛛實际高频抓取的地址,是不是你以為的那一個。
判断 canonical 有没有起作用,不要只看頁面标簽,要看日誌里蜘蛛走的那條路。路没變,标簽寫得再對,效果也有限。

最後提醒一句:canonical 解决的是哪個地址代表内容,不是蜘蛛该走哪條路。想让蜘蛛沿你设計的方向走,靠的是内鏈、Sitemap 和稳定的服務器响應;這三者對齐之後,canonical 才更容易被采纳。