把 canonical 当成“隐藏的链接入口”,是很多蜘蛛池入口页的常见做法:页面正文里不放可见链接,只在 head 里写一行 rel="canonical",指向想被抓的目标 URL。这样做到底有没有用?不同搜索引擎的处理并不完全一致,但可以给一个大致方向:canonical 有可能被当成 URL 发现线索,但它不是一条可靠的抓取通道,不能当成主力入口。
搜索引擎是怎么看 canonical 的
canonical 的本来用途是告诉搜索引擎“这一组重复页面里,哪一个才是代表版本”。它同时携带了一个绝对 URL,所以从解析角度看,它和普通超链接有相似之处:都是页面上出现的、指向另一个地址的字符串。
正因为如此,部分搜索引擎在处理 canonical 时,会顺手把它记录下来,用于扩充已知 URL 集合。也就是说,你的目标 URL 有机会因此进入待抓队列。但“有机会”和“会被抓”之间隔着好几道门:
- 它属于信号而非指令,是否采用、是否顺带发现,由搜索引擎自己决定;
- canonical 的语义是“合并”,不是“推荐抓取”,指向内容差异很大的页面时,容易被判为错误使用;
- 如果入口页本身没有抓取价值、长期不被抓,head 里的这行字自然也没人看见。
为什么不适合当主力入口
对比正文里的普通 a 标签,canonical 有几个硬伤。
- 可发现性更弱。正文链接是页面结构的一部分,canonical 只是元信息,很多工具链、校验流程根本不会把它算作外链。
- 不可控。你无法通过 rel 属性、锚文本、位置来影响它的抓取优先级,出了问题也不容易定位。
- 风险更高。如果入口页和目标页内容明显不同,等于在告诉搜索引擎“这两个是同一份内容”,反而可能让目标页被合并掉。
把 canonical 当作“多留一条线索”没问题,把它当作“主入口”就有点赌运气了。真正稳定的发现路径还是站内链接、sitemap 和正常的外链。
如果确实想用,比较稳妥的做法
- 只在入口页与目标页内容确实高度相似、属于同一主题时使用,避免语义冲突。
- canonical 写绝对地址,且与目标页真实 URL 完全一致,别带多余的跟踪参数。
- 同时保留正文里的一条普通超链接,让 canonical 只做补充而不是唯一通道。
- 用日志观察目标 URL 是否真的出现抓取记录,而不是只看提交接口的回显状态。
几个容易踩的误区
- 以为 canonical 一定不被跟:其实它可能被用于发现,只是不保证。
- 以为 canonical 一定被跟:不少时候它只被当作合并信号,并没有带来抓取。
- 在入口页堆几十条指向不同域名 URL 的 canonical:这明显不符合 canonical 的语义,容易被判为异常。
入口页该把重心放回哪里
与其琢磨 canonical 能不能当链接用,不如先确认入口页本身能不能被正常抓取:服务器返回 200、响应时间稳定、robots.txt 没有误封、页面没有大面积依赖 JS 渲染。这些基础条件不满足,canonical 写得再规范也没意义。
在这之上,正文里保留少量、指向明确的超链接,配合 sitemap 提交,通常比靠一条 canonical 去赌发现更靠谱。链接数量也没必要堆,入口页的链接越多,单条能分到的抓取机会反而越少。
怎么验证有没有效果
比较实际的办法是分组测试:一部分入口页只用 canonical,一部分只用正文链接,一部分两者都有,跑一段时间后对比服务器日志里目标 URL 的抓取次数、来源 IP 和抓取时间。日志里如果出现来自搜索蜘蛛的请求,且抓取路径能对上入口页,才算真的“被顺着发现了”。只凭提交后的状态提示,很难判断到底是哪条路径起了作用。
说到底,canonical 可以顺手写,但别指望它。入口页的核心还是让人和爬虫都能自然看到目标 URL,其他的都是锦上添花。