canonical 和 noindex 都属于写错一行、影响一片的标签。它们本身不阻止蜘蛛访问页面,只影响蜘蛛在拿到页面之后如何理解这个 URL。麻烦在于,这两个标签大多由模板批量输出,一旦模板逻辑出错,受影响的就是成百上千个页面;而在浏览器里看,页面完全正常,只有页面源码、抓取工具和服务器日志能暴露问题。
先分清三个信号各自的职责
- robots.txt 的 Disallow:阻止蜘蛛访问某个路径,蜘蛛拿不到页面内容。
- meta robots 的 noindex:允许访问,但不希望这个 URL 出现在搜索结果里。
- rel=canonical:在一组相似页面中,声明哪个 URL 是主要版本。
这三者经常被混着用。最常见的错误是:想让某类页面不出现在搜索结果里,就直接在 robots.txt 里 Disallow,结果蜘蛛根本读不到页面上的 noindex,标签等于没写。
robots.txt 管的是能不能抓,noindex 管的是要不要展示,canonical 管的是认哪一个。顺序搞反,效果就反了。
canonical 自查:指向的地址要真实可用
canonical 出问题,通常集中在下面几类:
- 指向的 URL 打不开,或需要经过一次跳转才能到达,等于挂了一个空指针。
- 全站页面统一指向首页,栏目页和内容页的价值被强行折叠到一起。
- 分页列表的第二页、第三页全部 canonical 到第一页,后续内容难以被单独识别。
- 带参数版本与干净版本互相 canonical,形成循环或者前后矛盾。
- 移动端与桌面端指向不一致,甚至两边互指。
核对方法并不复杂:随机抽取若干类型页面,打开源码看 canonical 写的是哪个地址,再把这个地址直接粘进浏览器,确认它能打开、返回正常状态、内容确实是希望被当作主版本的那一页。对参数页和筛选页,重点是看是否存在一个稳定的规范化目标,而不是每个参数组合都自成一套。
noindex 自查:确认没有误伤该被发现的页面
noindex 的风险更多来自范围失控。可以从这几个角度检查:
- 栏目列表页、详情页、分页后续页是否被模板统一加上了 noindex。
- 是否通过响应头 X-Robots-Tag 输出 noindex,而作用范围覆盖了整站或整个目录。
- 测试环境遗留的 noindex,是否在正式上线时忘记移除。
- 同一页面既写了 noindex,又写了指向别处的 canonical,两个信号互相打架。
- 被标记 noindex 的页面是否仍在 sitemap 里提交,形成自相矛盾的组合。
这里没有必要一律追求全部可索引。真正要做的是有意识地决定:哪些页面值得出现在搜索结果里,哪些页面只服务于站内跳转和用户路径。决定清楚之后,再让标签去执行这个决定。
用几种低成本方式验证
- 抽页面看源码,确认标签的实际输出,而不是只看后台设置项。
- 用抓取工具模拟一次请求,看返回的 HTML 头部区域是否符合预期。
- 结合服务器日志,观察被 noindex 的路径是否仍在被大量抓取,判断是否需要进一步收敛入口。
- 在搜索控制台查看已收录 URL 与规范声明之间是否存在明显冲突,逐条核对而不是只看总量。
把标签纳入日常的结构管理
标签不是设置一次就永久生效的东西。模板改版、栏目调整、批量导入内容、切换 HTTPS 或域名,都可能让原来的 canonical 指向失效。比较务实的做法是:把 canonical 与 noindex 的规则写进站点结构文档,注明每类页面应该输出什么;在每次改动模板或批量发布之后,挑几个代表页面复查一遍;发现指向失效地址的情况,优先修正模板,而不是逐个页面手工补。
这两件事看起来琐碎,但它们直接影响蜘蛛理解整个站点的成本。少一处自相矛盾的声明,就少一次让蜘蛛在重复版本之间反复确认的机会。