canonical 是一個不影响用戶、也不影响頁面正常打開的标簽,所以它常被忽略。但它决定了搜尋引擎在這個頁面存在多個訪問地址时,把哪一個当作主版本。寫對的时候没人注意,寫错的时候通常也不报错,只會慢慢表現為抓取分散、同一份内容被多個地址各分走一部分信号、改版之後舊地址迟迟不退场。
先確認頁面是不是真的需要它
不是每個頁面都必须寫 canonical,但绝大多數正常頁面應该寫自引用,也就是指向目前頁面的完整地址。最常见的错誤来自模板複製:詳情頁模板忘了改,结果全站詳情頁的 canonical 都指向栏目頁,或者栏目頁统一指向首頁。這類错誤一旦成批出現,等于主動告诉搜尋引擎“這些頁面不用單獨看”。
- 协议和域名要和實际訪問一致:https 頁面寫了 http 地址,或者 www 寫成了不带 www,等于把主版本让给了另一個地址。
- 末尾斜杠、大小寫、參數顺序保持统一,別让同一個栏目出現两套寫法。
- 列表頁、詳情頁、专题頁一般建议自引用,除非你确實打算把它們合並成一個地址。
參數頁與篩選頁怎么處理
排序、篩選、跟踪參數會生成大量高度相似的地址。處理时需要成体系,而不是逐頁凭感觉寫。
- 參數不改變内容主体,比如排序方式和分頁之外的纯展示參數:canonical 指回不带參數的干净地址。
- 參數带来的是不同内容集合,比如篩選後的獨立列表:可以考虑自引用,同时评估這個集合是否值得被單獨抓取。
- 跟踪參數:canonical 指回干净地址,別把带跟踪參數的地址当成主版本。
關键是一致性。同一個栏目里,一部分篩選頁自引用、另一部分指回列表頁,搜尋引擎很难判断規律,判断成本最後會轉嫁到抓取效率上。
分頁的 canonical 別寫反
分頁是容易出错的地方。常见做法是第 2 頁及之後自引用,而不是所有分頁都指回第 1 頁。全部指回第一頁,會让深层内容失去被單獨看待的机會。具体策略要结合站内實际情况决定,但至少不要在分頁之間形成互相指向的环,也不要让分頁的 canonical 指到一個被屏蔽或带 noindex 的地址上。
和 sitemap、robots、hreflang 對齐
- sitemap 里提交的地址,尽量和 canonical 声明的地址一致,避免提交清單和頁面声明互相矛盾。
- canonical 指向的地址不應被 robots.txt 屏蔽,也不應带 noindex,否則信号之間會打架。
- 多語言站点中,hreflang 使用的地址和 canonical 要能對得上,別一套指向 A、一套指向 B。
- 镜像站或备用域名做跳轉时,canonical 與跳轉目标保持一致,別一邊跳一邊声明另一個地址。
排查时從哪里入手
- 從抓取日誌里看搜尋引擎實际訪問的地址,再和頁面里声明的 canonical 做對比,找出明顯不一致的栏目。
- 抽查各栏目模板,確認没有统一的错誤 canonical,尤其是改版後新上线的模板。
- 观察搜尋结果中展示的地址,是否出現大量非预期域名或參數地址。這只是參考,不能作為唯一依據。
- 改版、換域名、栏目合並时,先梳理 canonical,再處理跳轉和 sitemap,顺序反了容易留下尾巴。
canonical 是建议,不是强制指令。但把它当成指令来寫,通常比把它当成装饰来寫要安全。
這份自查不需要一次做完。選一個栏目,把模板、分頁、參數三種情况各抽几個頁面看一遍,通常就能發現一批共性問题。發現之後優先改模板,而不是逐頁手工修补,否則下一次上新還會重复同样的错誤。