搭建蜘蛛池时,入口页通常是一批批量生成的页面,模板统一、结构相似。也正因为是批量操作,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 的采纳程度不同,也没有哪种写法能保证一定被怎么处理。入口页配置的原则是信号一致、意图清楚,剩下的交给爬虫自己判断。