同一份内容,如果存在多个都能正常打开的地址,蜘蛛会把它当成多条线索分别排队。判断依据不是页面里写了什么,而是 URL 字符串本身:字符不同,就是两条记录。
蜘蛛认的是字符串,不是内容
抓取队列里的键就是 URL。大小写不同、结尾斜杠有无、参数顺序颠倒,在队列里都是独立条目。蜘蛛通常不会先抓回来对比正文再合并,而是各自安排一次抓取。结果是同一个页面被反复取回,抓取额度被摊薄在重复地址上。
常见的“一页多址”
- 域名变体:example.com 与 www.example.com、http 与 https 四种组合都能访问。
- 结尾斜杠:/page 与 /page/ 都返回 200。
- 默认文件名:/ 与 /index.html、/default.aspx 同时存在。
- 参数顺序:?a=1&b=2 与 ?b=2&a=1 指向同一结果页。
- 追踪参数:utm_source、spm、from 之类只在来源页出现的参数。
- 大小写混用:/Article/123 与 /article/123。
- 筛选与排序:排序字段、每页条数等参数组合出的地址。
多址并存带来的代价
第一是重复消耗抓取次数。站点规模越大,重复地址占比越高,留给新页面的额度就越少。
第二是信号被拆散。外部链接、站内链接分别指向不同版本时,收到的指向被打到几个地址上,任何一个版本看起来都不如实际重要。
第三是日志判断变难。同一篇文章在日志里出现多行,统计“被抓了多少次”“多久重访一次”时容易得出错误结论,进而误判抓取节奏。
怎么把地址收敛成一条
- 先定规范版本。域名带不带 www、用 http 还是 https,只保留一种,并确认证书、DNS、CDN 都跟着走。
- 其余版本做 301 永久跳转。优先用 301 而不是 302,跳转目标直接指向最终地址,避免链式跳转。
- 站内链接统一写成规范版。导航、面包屑、正文内链、分页链接都别混用带斜杠和不带斜杠的写法。
- Sitemap 只放规范地址。不要为了“多递线索”把变体地址也写进去,那等于主动制造重复。
- canonical 作为兜底。当跳转难以实施时,用 canonical 指向规范版;它和 301 冲突时,通常跳转的优先级更高。
- 追踪参数单独处理。页面上生成的分享链接尽量在跳转层剥掉参数;robots.txt 管不了参数顺序问题,别指望它来兜底。
一个常被忽略的细节:蜘蛛抓取时通常不能区分 /Article/123 和 /article/123,但服务器可能能——如果服务器对大小写不敏感,两个地址都会返回 200,重复就此产生。
上线前快速自检
- 把规范地址换掉大小写、加减结尾斜杠,逐一访问,看是否都跳到同一个地址。
- 在日志里挑一个热门页面,看它有多少种写法被请求过。
- 抽查 Sitemap 中的 URL,是否与页面内链写法一致。
- 检查参数页是否被站内链接大量引用,必要时加 noindex 或限制入口。
URL 规范化不是一次性的整理工作,而是每次改版、上线新模块、接入新统计工具时都要过一遍的环节。地址收敛得干净,抓取额度才能真正用在没被抓过的页面上。