頁面明明返回 200、内容也完整,却在搜尋结果里找不到,取而代之出現的是它的另一個版本——這類情况里,canonical 常常是第一嫌疑人。canonical 不是强制指令,而是“我認為哪個 URL 才是正主”的声明。搜尋引擎會參考它,也會參考重定向、内鏈、sitemap、内容相似度,最後自己决定把哪個版本放進索引。所以当 canonical 指向別處时,你看到的“没收錄”,往往只是收錄落到了另一個 URL 上。
第一步:確認 canonical 實际指向哪里
不要只看後台設定或模板注释,按下面的顺序核對:
- 查看浏览器里的原始 HTML,也就是禁用脚本後看到的源代碼,確認 canonical 的 href 具体是什么。
- 查看渲染後的 DOM。如果 canonical 由前端脚本插入,原始 HTML 里可能没有,或者寫的是舊值,两個版本不一致时就會形成冲突。
- 检查 HTTP 响應头里是否也声明了 canonical。头部與 HTML 里不一致时,头部的權重通常更高。
- 確認這個 URL 在 sitemap、内鏈、分頁關系里,是否和 canonical 指向保持一致。
三類常见的指向错誤
一、该自指却没有自指
列表頁、詳情頁、分頁頁如果整站套用了同一個 canonical,比如都指向首頁或栏目首頁,等于告诉搜尋引擎“這些頁面都是那一個頁面的副本”。结果就是這些 URL 很难拿到獨立索引。内容頁、栏目頁通常應当自指。
二、跨頁合並用得太宽
用 canonical 把 A 頁指到 B 頁,本意是合並相似内容。但如果两頁的主题、關鍵詞、用戶意图並不相同,搜尋引擎可能干脆只保留 B 頁,A 頁的入口價值一起消失。跨頁 canonical 更适合處理參數版、排序版、打印版這類“同一内容的另一個外壳”。
三、多版本互相指
A 指 B、B 指 A,或者 A 指 B、B 指 C、C 又指回 A,形成环形或鏈式声明。這種信号自相矛盾,搜尋引擎只能忽略 canonical,自己按内容相似度判断,结果往往不可控。
冲突信号:canonical 说了不算的时候
- canonical 與 noindex 同时出現:noindex 通常更强,頁面會從索引里登出,canonical 也就失去了意义。两個一起用属于信号打架。
- canonical 指向一個 301 或 404 的地址:等于把正主的位置让给了一個不存在的 URL,索引狀態很容易變成未收錄或已排除。
- canonical 與 sitemap、内鏈不一致:sitemap 里列的是 A,canonical 指的却是 B,抓取预算和信号都被分散了。
判断标准可以简化成一句:如果這個 URL 值得被用戶單獨搜到,就让它自指;如果它只是同一内容的另一個外壳,才考虑指向主版本。
建议的核對顺序
- 列出受影响的 URL,確認各自 canonical 的實际值,原始 HTML、渲染後、响應头三處都要看。
- 判断属于“该自指未自指”還是“跨頁合並過头”,两種情况處理方式完全不同。
- 检查 canonical 的目标地址是否返回 200、是否可被抓取、本身是否自指。
- 检查同一個 URL 上是否還叠着 noindex、重定向、參數規則等冲突信号。
- 修正後尽量保持一段時間不動,观察索引狀態的變化,避免反复改来改去。
改動的生效需要時間,索引狀態也不會立刻同步。與其反复提交地址,不如先把 canonical 這一层的指向和冲突理清楚,再看下一步。