有些站点并没有两个内容相同的页面,索引里却出现了好几条看起来一样的地址。问题往往不在内容,而在 URL 本身——同一个页面被写成了好几种形式,抓取和索引系统只能把它们当成多个地址分别处理。
常见的地址变体有哪些
- 协议不同:http 与 https 两个版本都能打开;
- 主机名不同:带 www 与不带 www;
- 结尾斜杠不同:/about 与 /about/;
- 大小写不同:/About 与 /about;
- 默认文件:根目录 / 与 /index.html;
- 路径里混入多余片段:/./about、//about、/about/../about。
这些差异在浏览器里大多能打开同一份内容,用户看不出区别,但对抓取系统来说,它们是不同的字符串,也就可能被当作不同的 URL。
为什么需要统一
同一份内容对应多个可访问地址,会带来几个具体影响:
- 外链和站内链接指向不同写法,信号被拆散到多个地址上;
- 同一份内容被反复抓取,占用了本可以分配给其他页面的抓取资源;
- 站点地图、canonical、内链给出的写法不一致时,系统只能自己判断,结果往往不可控。
先确定一个规范写法
处理之前先把规则定下来,不要边改边试。可以按下面的顺序做决定:
- 协议:全站统一到 https;
- 主机名:www 还是裸域,二选一,全站一致;
- 路径:统一小写,并明确目录路径是否带结尾斜杠;
- 首页:统一使用 /,不再对外暴露 index.html 等默认文件。
定好之后写成文档,模板和新页面都按同一规则生成,避免一边修旧的一边产生新的。
在服务器层面做重定向
比较稳妥的做法是让所有非规范写法 301 跳转到规范地址,而不是让它们各自返回 200 内容。这样即使用户或外部链接用了旧写法,最终也会落到同一个地址上。
需要注意跳转不要形成链条。像“http + 无 www + 大写路径”这种组合,最好一次跳到最终地址,而不是先跳 https、再跳 www、最后跳大小写。中间环节越多,出问题的概率越高。
重定向的目标要直接指向最终地址。链式跳转虽然也能走通,但每一环都多一次请求,也更容易在某一环配置失误。
页面内的信号要跟着统一
做到这一步还不够,页面里输出的地址也要一致:
- canonical 标签统一写规范地址,不要一页一种写法;
- 站点地图只提交规范地址,不混入重定向地址;
- 站内链接——导航、面包屑、正文内的链接——全部使用规范写法。
内部链接是最容易被忽略的一块。同一个目标页,导航里写一种、正文里写另一种的情况很常见,改的时候要一起过一遍。
几个容易踩的点
- 只改 canonical 不做跳转:旧地址仍能直接访问,仍可能被单独抓取;
- 服务器区分大小写:/About 返回 404,而页面里恰好用了大写链接;
- 目录与文件之间混用结尾斜杠,导致部分路径 404;
- 改版后旧跳转没有清理,指向了已经变化的地址,形成环路;
- CDN 或反向代理层另有规则,把源站的跳转覆盖掉了。
怎么检查现状
- 从站点地图、导航、正文链接、外部链接里各取一批 URL,统计有几种写法;
- 用抓取工具模拟请求,记录响应码和最终落地地址;
- 翻服务器日志,看同一路径不同写法的访问量分布;
- 核对 canonical 写法和实际跳转目标是否指向同一个地址。
URL 统一不是做完一次就结束的事。新栏目、新模板、外包开发都可能带进新的写法,把它放进发布前的检查清单里,比事后批量清理要省力得多。