canonical 标簽的作用是告诉搜尋引擎:這一组内容相近的 URL 里,哪一個是你認定的主版本。它是提示而不是强制指令,但會被認真參考。麻烦在于,canonical 通常由模板自動生成,規則一旦寫错,就會在整站范围扩散,等到發現問题时,往往已经积累了大量被错誤處理的地址。
常见的 canonical 错誤
指向了會 301 跳轉的舊地址
站点改版後,頁面模板里的 canonical 還寫着舊域名或舊路径,是很常见的情况。蜘蛛抓到新頁面,看到 canonical 指向一個會跳轉的地址,就得額外走一跳;有时它干脆按舊地址来理解,新 URL 迟迟得不到采纳。這類問题通常發生在迁移收尾阶段,迁移清單做完就没人再回头看模板。
分頁頁面全部指向第一頁
關于分頁的 canonical 寫法,行业建议经歷過調整。目前更稳妥的做法是让每個分頁的 canonical 指向自身。如果整站的分頁都指向第一頁,第二頁、第三頁上的内容就很难被單獨發現,尤其是那些只在分頁里出現的條目。
模板批量輸出错誤
典型表現是所有頁面的 canonical 都指向首頁,或者所有文章頁都指向所属栏目頁。這類错誤多半来自主题、插件或 CMS 的配置疏漏,肉眼看两三個頁面不容易察觉,需要批量抓取後才能暴露出来。
canonical 與 hreflang 互相冲突
多語言站点里,canonical 應当指向同一語言版本的自身 URL,而不是把所有語言版本都指向英文主站。两個信号指向不同目标,搜尋引擎需要自己判断,结果常常不是你预期的那個版本被保留。
指向被屏蔽或不存在的 URL
如果 canonical 的目标地址被 robots.txt 禁止抓取,或者本身已经返回 404,主版本信号就落空了。蜘蛛看不到目标頁面,只能退回自行判断。寫 canonical 之前,先確認目标能正常訪問,是個容易忽略但很基本的前提。
一套可执行的自查流程
- 用爬虫工具批量抓一遍全站,導出所有 URL 及其 canonical 值,逐行與實际地址對比。
- 筛出 canonical 不等于自身 URL 的记錄,按類型归類:大小寫差异、末尾斜杠、http 與 https、带 www 與不带 www、參數差异。
- 抽查這些 canonical 目标的可訪問性:是否返回 200,是否被 robots.txt 拦住,是否會再次跳轉。
- 重点检查分頁、篩選、排序、追踪參數這几類頁面,看它們各自的規范處理是否符合预期。
- 回到模板层,確認主题、插件、CDN 的邊缘規則里有没有二次改寫 canonical 的逻辑。
几個容易被跳過的细节
- canonical 寫成相對路径时,要注意基准地址。頁面里的 base 标簽會改變解析结果。
- 协议和主机名建议寫完整,不要為了省字符而省略。
- 在大小寫敏感的服務器上,/Page 和 /page 是两個不同的地址。
- 如果頁面本身已经做了 301,canonical 的意义就不大,把 301 指對更重要。
- canonical 的目标頁面最好能正常返回,並且内容确實是你想作為主版本的那一版。
把它變成维護习惯
把 canonical 的生成規則寫進模板說明里,改動路由或 URL 结构时同步检查。每次站点改版、栏目調整、CMS 升級之後跑一遍對比,比事後從訪問日誌里倒推要省事得多。對中小站点来说,這一步花不了多少時間,却能避免大量重复地址長期堆积。
canonical 只是提示。如果它與頁面内容、内部連結、Sitemap 中的地址互相矛盾,搜尋引擎會自己選一個,而那個未必是你想要的。让這几處保持一致,往往比反复微調 canonical 更有效。
自查的目标不是追求某種完美格式,而是让站点對外表達的信号前後一致。一處寫對不难,难的是几百上千個頁面都寫對,並且在下一次改版後依然寫對。