翻服务器日志时,常能看到这样一幕:同一个栏目页,以 /news、/news/、/News、http 版和 https 版几种写法轮流被访问。对运营者来说这只是同一个页面的几种入口,对抓取系统来说,它们是一组需要分别请求、分别判断、分别存储的地址。
同一份内容,常见的几种地址写法
重复地址很少是刻意制造的,多数来自模板、跳转配置和用户复制链接的习惯。比较常见的有这几类:
- 协议与主机名不一致:http 与 https 都能打开,带 www 与不带 www 都返回 200。
- 末尾斜杠差异:/about 与 /about/ 各自能访问,且都不跳转。
- 大小写差异:/About 与 /about 指向同一份内容,服务器未做大小写归一。
- 默认文件名:目录地址与目录下的默认页面(如 index.html)同时可用。
- 参数顺序与无用参数:同一组筛选条件,参数顺序不同,或者多带了一个来源标记。
- 编码写法不同:中文路径、空格、特殊符号用不同编码形式表示。
- 分页、排序、筛选参数生成的近似地址,数量往往成倍增长。
为什么要收敛这些写法
每一个可访问的 URL,都会在抓取时占用一次请求机会、一次解析、一次存储和一次去重判断。当地址写法分散时,抓取资源会被摊到多条近似地址上,而真正需要被更新的页面反而排到后面。这种影响不是马上能看出来的,通常要结合日志里的抓取分布来判断。
把同一份内容写成多个可访问的地址,不会让内容变得更丰富,只会让抓取和索引阶段的判断更模糊。
从日志和 Sitemap 里找线索
- 导出近一段时间的抓取日志,按路径做统计,看看是否存在同一路径的多种写法被分别访问。
- 把 Sitemap 中提交的地址和实际被抓的地址放在一起比对,看差集里有多少是写法不同的同一页面。
- 抽查页面源码,确认内链、导航、面包屑、分页链接是否统一使用一种写法,模板里最容易混用。
- 在返回 200 的地址中抽样,检查有多少属于近似重复内容,这一步能大致估出收敛的必要程度。
收敛时可以用的几种手段
- 先确定一个主地址形态,例如统一使用 https、统一带 www、统一带末尾斜杠,然后全站按这个形态执行。
- 其余写法通过 301 跳转到主地址,跳转要一步到位,避免形成跳转链。
- Sitemap 只放主地址,不要同时提交多种写法。
- 站内所有链接,包括导航、正文内链、分页、面包屑,都用主地址写法,减少蜘蛛在站内就会遇到的重复入口。
- canonical 可以作为补充声明,但它不是替代跳转的手段,两者建议配合使用而不是只留一个。
- 参数类地址如果确实不需要被抓取,可在 robots 或页面层面处理,别指望靠一个标签解决全部问题。
服务器层面的配合更省事
如果 http 与 https、裸域与 www 都能返回 200,说明统一跳转没有配置到位。在服务器配置里加一层 301,让所有非主形态的请求都落到同一个地址,比在页面层面事后修补要稳定得多。反过来,如果服务器状态码本身不稳定,地址统一也很难真正生效。
另外要注意,抓取系统确实会做一定程度的去重判断,但那是它内部的逻辑,你无法指定它最终选中哪一条作为代表。能控制的部分是:自己站点对外暴露的地址写法保持一致,让蜘蛛进入站内后遇到的每一条内链、每一个 Sitemap 条目,都指向同一个地址。把这件事做扎实,比研究它怎么去重更实际。