站点运营

canonical 标簽自查:別让蜘蛛在多個版本之間選错頁面

canonical 标簽常由模板批量生成,一旦規則寫错就會在全站扩散。本文梳理指向舊地址、分頁全部指向第一頁、模板輸出错誤、與 hreflang 冲突等常见問题,並给出一套可执行的自查步骤,帮助站点把主版本信号理顺。

站点运营

canonical 标簽自查:別让蜘蛛在多個版本之間選错頁面

canonical 标簽的作用是告诉搜尋引擎:這一组内容相近的 URL 里,哪一個是你認定的主版本。它是提示而不是强制指令,但會被認真參考。麻烦在于,canonical 通常由模板自動生成,規則一旦寫错,就會在整站范围扩散,等到發現問题时,往往已经积累了大量被错誤處理的地址。

常见的 canonical 错誤

指向了會 301 跳轉的舊地址

站点改版後,頁面模板里的 canonical 還寫着舊域名或舊路径,是很常见的情况。蜘蛛抓到新頁面,看到 canonical 指向一個會跳轉的地址,就得額外走一跳;有时它干脆按舊地址来理解,新 URL 迟迟得不到采纳。這類問题通常發生在迁移收尾阶段,迁移清單做完就没人再回头看模板。

分頁頁面全部指向第一頁

關于分頁的 canonical 寫法,行业建议经歷過調整。目前更稳妥的做法是让每個分頁的 canonical 指向自身。如果整站的分頁都指向第一頁,第二頁、第三頁上的内容就很难被單獨發現,尤其是那些只在分頁里出現的條目。

模板批量輸出错誤

典型表現是所有頁面的 canonical 都指向首頁,或者所有文章頁都指向所属栏目頁。這類错誤多半来自主题、插件或 CMS 的配置疏漏,肉眼看两三個頁面不容易察觉,需要批量抓取後才能暴露出来。

canonical 與 hreflang 互相冲突

多語言站点里,canonical 應当指向同一語言版本的自身 URL,而不是把所有語言版本都指向英文主站。两個信号指向不同目标,搜尋引擎需要自己判断,结果常常不是你预期的那個版本被保留。

指向被屏蔽或不存在的 URL

如果 canonical 的目标地址被 robots.txt 禁止抓取,或者本身已经返回 404,主版本信号就落空了。蜘蛛看不到目标頁面,只能退回自行判断。寫 canonical 之前,先確認目标能正常訪問,是個容易忽略但很基本的前提。

一套可执行的自查流程

  1. 用爬虫工具批量抓一遍全站,導出所有 URL 及其 canonical 值,逐行與實际地址對比。
  2. 筛出 canonical 不等于自身 URL 的记錄,按類型归類:大小寫差异、末尾斜杠、http 與 https、带 www 與不带 www、參數差异。
  3. 抽查這些 canonical 目标的可訪問性:是否返回 200,是否被 robots.txt 拦住,是否會再次跳轉。
  4. 重点检查分頁、篩選、排序、追踪參數這几類頁面,看它們各自的規范處理是否符合预期。
  5. 回到模板层,確認主题、插件、CDN 的邊缘規則里有没有二次改寫 canonical 的逻辑。

几個容易被跳過的细节

  • canonical 寫成相對路径时,要注意基准地址。頁面里的 base 标簽會改變解析结果。
  • 协议和主机名建议寫完整,不要為了省字符而省略。
  • 在大小寫敏感的服務器上,/Page 和 /page 是两個不同的地址
  • 如果頁面本身已经做了 301,canonical 的意义就不大,把 301 指對更重要。
  • canonical 的目标頁面最好能正常返回,並且内容确實是你想作為主版本的那一版。

把它變成维護习惯

把 canonical 的生成規則寫進模板說明里,改動路由或 URL 结构时同步检查。每次站点改版、栏目調整、CMS 升級之後跑一遍對比,比事後從訪問日誌里倒推要省事得多。對中小站点来说,這一步花不了多少時間,却能避免大量重复地址長期堆积。

canonical 只是提示。如果它與頁面内容、内部連結、Sitemap 中的地址互相矛盾,搜尋引擎會自己選一個,而那個未必是你想要的。让這几處保持一致,往往比反复微調 canonical 更有效。

自查的目标不是追求某種完美格式,而是让站点對外表達的信号前後一致。一處寫對不难,难的是几百上千個頁面都寫對,並且在下一次改版後依然寫對。