搭建蜘蛛池时,入口頁通常是一批批量生成的頁面,模板统一、结构相似。也正因為是批量操作,canonical 這種看起来每個頁面都该有的标簽,很容易被整段複製過去,最後指向了不该指的地方。canonical 本身不是命令,它只是给爬虫的一個提示,但错誤使用會让入口頁在爬虫眼里變得模糊。
canonical 到底在说什么
canonical 的用途是告诉爬虫:這一组内容差不多的 URL 里,我認為哪一個才是代表。它常用于處理參數重复、打印頁、排序頁這類同内容多 URL 的情况。它和 301 不同:301 是服務器层面的跳轉,訪問者會被带到新地址;canonical 只是頁面上的声明,訪問者留在原頁面,爬虫自行决定是否采纳。
在蜘蛛池场景里,入口頁的作用是提供一條可被發現的路径,把爬虫引到目标頁。入口頁自己通常不需要參與排名,也不需要和谁争代表。理解這一点,才能判断 canonical 该怎么寫。
入口頁常见的几種寫法
指向目标頁
這是最常见的一種誤操作:入口頁批量生成时,模板里寫死了目标頁的 URL,于是所有入口頁都 canonical 到同一個目标頁。這样做等于在告诉爬虫:這些入口頁都不是獨立頁面,真正的内容在目标頁。爬虫可能會减少對入口頁的抓取和索引,入口頁作為路的作用就被削弱了。如果入口頁本来只是為了被發現,不指望被索引,這種寫法未必致命;但如果入口頁本身需要承载一些連結、需要被反复訪問,就不太合适。
指向首頁或栏目頁
有些模板會把 canonical 统一指向站点首頁,理由是首頁最重要。對普通站点来说,這種做法已经過时;對蜘蛛池入口頁来说更没必要。入口頁和首頁内容通常並不相同,强行声明同一代表,只會让爬虫對頁面的主题判断更混乱。
指向自身
如果入口頁是獨立 URL,内容也确實是這一頁自己的,那么 canonical 指向自身是安全的寫法。它的作用是防止參數、大小寫、结尾斜杠等變体被当成多個頁面。前提是 URL 形態本身已经统一,否則每個變体都寫自己,反而分散。
干脆不寫
不寫 canonical 並不會让頁面出問题,只是失去了一层去重提示。入口頁如果内容差异明顯、URL 也干净,不寫完全可以。很多蜘蛛池入口頁属于模板生成,内容相似度高,這时不寫 canonical 可能让爬虫面對多個近似頁面;寫错則更糟。取舍在于:先保證 URL 干净,再考虑是否需要 canonical。
多個入口頁之間要不要互相 canonical
如果一批入口頁内容高度相似,只是替換了少量關鍵詞或連結,可以考虑让它們各自指向自身,但前提是每頁确實有獨立存在的理由。如果只是為了铺量,内容几乎一样,那么更實际的做法是减少重复頁面,而不是用 canonical 硬撑。canonical 不能把相似内容變成不同内容,它只能表達我認為谁代表谁。
和 301、robots、sitemap 的分工
- 301:用于舊地址永久迁移,訪問者會被跳轉。入口頁要換地址时用它,不要用 canonical 代替。
- robots:控制爬虫能不能抓。想阻止抓取用 robots,不要指望 canonical 阻止索引。
- sitemap:列出希望被發現的 URL。如果入口頁 canonical 指向目标頁,又把入口頁放進 sitemap,两個信号會互相矛盾。
這几個工具各管一段,混用之後爬虫收到的信号會打架。入口頁的 canonical 一旦确定,最好和 sitemap、内鏈、robots 的意图保持一致。
检查顺序建议
- 先统一 URL 形態,把參數、大小寫、结尾斜杠處理干净。
- 確認每個入口頁是否有獨立内容。内容几乎一样的頁面,先考虑合並或删减。
- 再决定 canonical:獨立頁面指向自身;不需要被索引的入口頁可以留空或按實际情况處理,不要机械地指向目标頁。
- 检查模板有没有寫死 canonical,避免所有入口頁都指向同一個地址。
- 用抓取日誌或响應检查工具看爬虫實际訪問了哪些 URL,確認 canonical 没有制造額外的重复訪問。
canonical 是提示,不是開關。入口頁的核心任務是被找到和把路径传下去,不要因為一個複製粘贴的标簽让爬虫在入口頁上多绕一圈。
最後提醒一句:不同搜尋引擎對 canonical 的采纳程度不同,也没有哪種寫法能保證一定被怎么處理。入口頁配置的原則是信号一致、意图清楚,剩下的交给爬虫自己判断。