蜘蛛池里的入口页往往是模板批量生成的,同一套内容会铺在很多域名上,很容易出现一个页面被蜘蛛当成好几个 URL 的情况。抓取次数是有限的,重复地址越多,真正需要被看到的页面分到的份额就越少,日志里也更难判断蜘蛛到底抓了什么、漏了什么。URL 规范化做的事很简单:把同一份内容固定在一个地址上,其他写法都指向它。
哪些地方容易长出重复 URL
- 大小写差异:/Page 和 /page 在部分服务器上都能返回 200
- 尾斜杠差异:/a 和 /a/ 同时可访问
- 主机名差异:www 与非 www、http 与 https、带与不带默认端口
- 目录默认文件:/a/ 与 /a/index.html 同时存在
- 查询参数:utm、来源标记、排序、会话 ID
- 编码差异:中文路径的百分号编码方式不一致
- 多余斜杠与点号://a、/./a、/a/../a 这类写法
先定一个规范形式,再让其他写法指向它
规范形式没有标准答案,选一个自己维护起来最省事、也最容易在模板里统一生成的即可。多数情况下是全小写路径、统一尾斜杠规则、固定一个主机名、不带多余参数。
定完之后,把其余写法用 301 永久跳转到规范形式。301 是明确信号,蜘蛛会逐步把老地址替换掉;302 只是临时跳转,容易让两个地址长期并存。
跳转链不要绕圈:A 跳到 B,B 又跳回 A,蜘蛛跟进几次之后往往就不再继续。
参数是最容易失控的一类
入口页本身很少需要参数,但模板、统计脚本、外部引荐都会往地址上挂参数。处理前先分成两类。
影响内容的参数
分页、分类、筛选这类会改变页面内容的参数应当保留,并让每一种取值都有唯一的规范形式。分页建议保留,让蜘蛛能顺着往后走,而不是全部一刀切掉。
不影响内容的参数
utm、ref、from、会话 ID 这类只影响统计、不影响内容的参数,可以用 301 跳回不带参数的地址。如果组合太多太杂,也可以在 robots 里按参数特征整体屏蔽,但要先确认这些地址不是你想让蜘蛛抓的。注意不要一边屏蔽一边又指望它被收录,这两件事是冲突的。
大小写与尾斜杠的细节
- 服务器不区分大小写时,/AbC 同样可访问,建议在应用层把大写路径 301 到小写
- 尾斜杠统一之后,链接、sitemap、canonical 里都要跟着改,只改一处没有意义
- 静态目录的 index.html 建议 301 到目录本身,避免两个地址同时可访问
canonical 能替代 301 吗
canonical 是提示,不是指令,搜索引擎可以采纳也可以忽略;301 是服务器层的跳转,信号更明确。比较稳的做法是两者保持一致:能 301 的用 301,同时把 canonical 指向同一个规范地址。如果 301 暂时铺不开,canonical 至少能先统一信号。
但要避免自相矛盾的情况:A 页面 canonical 指向 B,B 又指回 A;或者 canonical 指到一个在 robots 里被屏蔽的地址。
落地顺序
- 先从服务器日志里按请求量排序,找出重复最严重的几类地址
- 确认这些地址返回的状态码与内容是否一致
- 在模板层统一生成规范 URL,链接、sitemap、canonical 同步修改
- 对非规范形式加 301,检查有没有形成跳转链
- 观察一段时间日志,看非规范地址的请求是否下降、规范地址的抓取是否稳定
- 收口完成之后再考虑扩量
几个常见误区
- 用 302 代替 301,导致两个地址长期并存
- 只加 canonical 不改站内链接,页面依旧大量指向非规范地址
- 对规范地址本身也设了 Disallow,等于把正主挡在外面
- 参数全部砍掉,连分页也 301 回第一页,蜘蛛反而进不去更深的内容
- 改完不久又换一套写法,蜘蛛还没处理完,规则又变了
改完怎么看
重点看三件事:非规范形式的请求量是否下降,规范地址的抓取频次是否稳定,日志里的 301 响应是否集中且没有成环。URL 规范化本身不直接带来收录,它做的是减少无效抓取,把有限的机会让给真正需要被看到的地址。这一步做不干净,后面加多少入口页都会被稀释。