做站点运营时,最容易被忽略的一類問题是:同一篇内容在站点里存在好几個可以訪問的地址。用戶看不出区別,蜘蛛却會把它当成多個頁面分別處理。canonical 标簽就是用来解决這個問题的,但用错了反而會添乱。
同一篇内容為什么會有多個地址
常见的来源包括:
- 带參數的地址,比如列表翻頁、排序、来源追踪參數;
- www 與非 www、http 與 https 混用;
- 带尾斜杠與不带尾斜杠同时可訪問;
- 打印頁、移動版獨立地址、专题聚合頁;
- 内容被搬到站内其他栏目,留下了两份。
這些地址如果都返回 200 且都能被抓取,就等于把同一份内容重复投喂给搜尋引擎。
canonical 在说什么
canonical 是寫在頁面 head 里的一個連結标簽,作用是告诉蜘蛛:這一组相似頁面里,哪一個是我認可的正式版本。
它是一條建议,不是强制指令。搜尋引擎會參考,但如果頁面上的其他信号(内鏈、Sitemap、重定向)與它互相矛盾,它很可能被忽略。
所以 canonical 要和内鏈、Sitemap、robots 放在一起看,單獨设一個标簽解决不了所有問题。
自查时容易踩的坑
1. 指向了不可訪問的地址
canonical 指向的 URL 如果是 404、被 robots 屏蔽,或者本身還有重定向,這個标簽基本失效。指向的地址自己要先能正常打開。
2. 頁面之間互相指向
A 頁寫 canonical 到 B,B 頁又寫 canonical 到 A,形成循环。這種情况蜘蛛通常两邊各按各的處理,等于白寫。
3. 全站批量寫死同一個地址
有些模板為了省事,把 canonical 统一寫成首頁地址。结果是所有内頁都在说“我不是正主”,對收錄非常不利。
4. 分頁頁面處理不当
分頁的第二頁、第三頁不要 canonical 到第一頁。它們各自是不同的内容列表,正确做法是保留自身地址,並做好上一頁、下一頁的關系說明。
5. 和重定向混着用
如果舊地址已经做了 301 到新地址,舊地址就不必再寫 canonical。两者同时存在容易让信号混乱。
一份简單的自查清單
- 随机抽 20 個内頁,查看源碼中的 canonical 地址,確認能正常打開並返回 200;
- 確認 canonical 地址與頁面實际 URL 的主机名、协议、尾斜杠寫法一致;
- 检查是否存在 A 指向 B、B 指向 A 的循环;
- 检查列表頁、篩選頁是否誤寫了 canonical 指向首頁或栏目首頁;
- 對照 Sitemap,確認提交的地址與 canonical 指向的是同一個;
- 確認被 canonical 掉的地址没有被大量内鏈指向,否則信号會打架。
和 robots、重定向怎么分工
- robots.txt:控制蜘蛛能不能抓,不直接控制能不能收錄,适合屏蔽無意义的參數地址;
- 301 重定向:地址永久搬家,權重與收錄跟着走,适合改版和栏目合並;
- canonical:几個地址都能訪問,内容高度相似,用来指定首選版本;
- noindex:明确不想要這個頁面出現在结果里。
四者用途不同,別拿一個去替代另一個。
落地建议
站点規模不大时,可以先把 canonical 的模板逻辑固定下来:預設指向目前頁面的規范地址,只在确實存在重复内容时才做特殊處理。改完之後,观察服務器日誌里這些地址的抓取频次和狀態碼變化,往往比盯着一两個頁面的标簽更有用。
重复内容不是一夜之間出現的問题,解决它也不需要一次性全站推倒重来。按栏目分批梳理,先把明顯重复的地址處理掉,再逐步收紧模板,是更稳妥的做法。