蜘蛛发现 URL 的方式很直接:顺着链接、Sitemap、日志里的旧地址爬。但对它来说,URL 是一个字符串,不是“页面”。字符串差一个字符,就可能被当成另一个地址。很多站点并不是内容重复,而是 URL 写法重复,结果蜘蛛把同一份内容抓了好几遍,抓取预算被分散,日志也变得难读。
主机名和协议:先确定唯一的入口
主机名不区分大小写,Example.com 和 example.com 对蜘蛛来说通常指向同一个站点,但协议和端口会带来分叉。
- http 与 https 是两个 URL,如果两个都能访问,蜘蛛可能分别抓取。
- 带 :80、:443 的显式端口和不带端口的写法,最好统一。
- 带 www 与不带 www 的域名,选一个作为主域名,另一个做 301。
这些分叉一旦同时可访问,蜘蛛不会自动帮你合并;它只会按照链接里出现的写法去抓。
路径大小写:服务器说了算
URL 路径部分通常区分大小写。/About 和 /about 在多数 Linux 服务器上是两个不同地址。如果两都能返回 200,蜘蛛就会当成两个页面。有些 CMS 或框架会自动做小写重定向,有些不会,需要自己确认。
检查方法很简单:在服务器日志里搜同一个路径的不同大小写写法,看是否都有蜘蛛访问记录。如果有,说明内链或外链里混用了。
末尾斜杠:/a 和 /a/ 不是一回事
末尾斜杠的处理方式因服务器和框架而异。常见情况有三种:
- 两者返回同一份内容,都是 200。
- 其中一个 301 到另一个。
- 两者返回不同内容,比如 /a 是列表,/a/ 是首页。
第一种和第三种都容易让蜘蛛分别抓取。建议在服务器层统一:选一种写法,另一种用 301 跳转过去,并且内链、Sitemap、canonical 都用同一版本。
index 文件与目录地址
/category/index.html、/category/、/category 在很多服务器上指向同一个文件。如果都返回 200,蜘蛛可能把它们当成三个地址。处理方式同样是挑一个规范地址,其余 301。
URL 规范化不是为了让蜘蛛少抓,而是让它把抓取次数用在真正不同的内容上。
查询参数:顺序和无关参数
参数也是 URL 字符串的一部分。?page=2&sort=new 和 ?sort=new&page=2 在蜘蛛眼里是两个 URL。跟踪参数、会话参数、排序参数如果大量出现在内链里,会制造出成倍的变体。
- 跟踪参数尽量在生成链接时去掉,或统一在服务端做 301。
- 排序、筛选参数如果内容相同,可以用 canonical 指向无参数版本,但不要指望它一定被采纳。
- 分页参数要保留,因为那是不同内容。
把规范 URL 固定下来
做法不复杂,关键是统一:
- 在服务器配置里做 301,把大小写、末尾斜杠、index 文件、默认端口归一到规范写法。
- 内链生成时就用规范 URL,不要一会儿带斜杠一会儿不带。
- Sitemap 里只放规范 URL。
- canonical 标签作为补充,指向规范地址。
做完之后,用日志抽查一段时间,看蜘蛛是否还在抓非规范版本。如果还有,多半是外链或旧内链残留,可以慢慢清理,不必一次性追求零重复。蜘蛛的抓取安排会随着链接写法稳定而逐渐收敛。