搜索抓取

大小写、末尾斜杠与 index 文件:同一个页面在蜘蛛眼里有几个地址

蜘蛛把 URL 当字符串处理,大小写、末尾斜杠、index 文件和默认端口都可能让同一页面变成多个地址。本文梳理常见分叉写法、服务器 301 归一方法,以及内链和 Sitemap 里如何固定规范 URL,减少无意义的重复抓取。

搜索抓取

大小写、末尾斜杠与 index 文件:同一个页面在蜘蛛眼里有几个地址

蜘蛛发现 URL 的方式很直接:顺着链接、Sitemap、日志里的旧地址爬。但对它来说,URL 是一个字符串,不是“页面”。字符串差一个字符,就可能被当成另一个地址。很多站点并不是内容重复,而是 URL 写法重复,结果蜘蛛把同一份内容抓了好几遍,抓取预算被分散,日志也变得难读。

主机名和协议:先确定唯一的入口

主机名不区分大小写,Example.com 和 example.com 对蜘蛛来说通常指向同一个站点,但协议和端口会带来分叉。

  • http 与 https 是两个 URL,如果两个都能访问,蜘蛛可能分别抓取。
  • 带 :80、:443 的显式端口和不带端口的写法,最好统一。
  • 带 www 与不带 www 的域名,选一个作为主域名,另一个做 301。

这些分叉一旦同时可访问,蜘蛛不会自动帮你合并;它只会按照链接里出现的写法去抓。

路径大小写:服务器说了算

URL 路径部分通常区分大小写。/About 和 /about 在多数 Linux 服务器上是两个不同地址。如果两都能返回 200,蜘蛛就会当成两个页面。有些 CMS 或框架会自动做小写重定向,有些不会,需要自己确认。

检查方法很简单:在服务器日志里搜同一个路径的不同大小写写法,看是否都有蜘蛛访问记录。如果有,说明内链或外链里混用了。

末尾斜杠:/a 和 /a/ 不是一回事

末尾斜杠的处理方式因服务器和框架而异。常见情况有三种:

  1. 两者返回同一份内容,都是 200。
  2. 其中一个 301 到另一个。
  3. 两者返回不同内容,比如 /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 标签作为补充,指向规范地址。

做完之后,用日志抽查一段时间,看蜘蛛是否还在抓非规范版本。如果还有,多半是外链或旧内链残留,可以慢慢清理,不必一次性追求零重复。蜘蛛的抓取安排会随着链接写法稳定而逐渐收敛。