同一個頁面,在服務器上可能對應好几個地址。大小寫不同、末尾有没有斜杠、參數顺序調換,這些都能让蜘蛛把它当成两條 URL。抓取次數被分散,入口信号也會拆散。下面讲怎么核對並收敛這些變体。
常见的 URL 變体類型
- 大小寫差异:/About 與 /about 在某些服務器上指向同一文件,在另一些配置下會返回 404。
- 末尾斜杠:/page 與 /page/ 是否等價,取决于服務器配置和框架路由。
- 查询參數顺序:?a=1&b=2 與 ?b=2&a=1,多數程序返回相同内容,地址串却不同。
- 追踪參數:utm_source、from、ref 之類,會把同一内容拆成很多地址。
- 預設文档:/index.html 與 / 指向同一個頁面。
- 协议與主机名:http 與 https、带 www 與不带 www。
變体為什么會让抓取變得零散
蜘蛛判断一個地址见没见過,主要靠 URL 字符串。字符串不同,就当成新地址排队。结果通常是:
- 同一份内容的抓取次數成倍上升,真正更新的頁面反而排到後面。
- 内鏈指向不同變体,蜘蛛顺着連結走时,容易落到非規范的那一條。
- Sitemap、内鏈、外鏈各指向一個版本,入口信号不集中。
抓取日誌里如果同一篇内容出現多條地址,先別急着判定是重复抓取,先確認這些地址是不是變体。
核對顺序
- 在抓取日誌里按路径片段聚合,找出同一内容對應的多條地址。
- 检查站内連結實际寫的是哪一條,尤其是導航、面包屑和列表頁。
- 看 Sitemap 里放的是哪一條。
- 看頁面 canonical 声明的又是哪一條。
這四處如果指向不同地址,說明變体的来源不止一處,需要逐項统一,而不是只改其中一處。
處理方式
能跳轉的就跳轉
确定主地址後,其余變体用 301 指過去。跳轉鏈只保留一跳,不要 a 到 b、b 再到 c。主机名和协议层面的统一,一般放在服務器或 CDN 层處理更省事。
跳不了的用 canonical
參數類變体往往没法全部做跳轉,尤其是带追踪參數的外鏈。這时可以在頁面上声明 canonical,指向不带參數的規范地址。canonical 是提示而非强制,所以内鏈和 Sitemap 仍然要统一到規范地址,不能只靠它兜底。
内鏈和 Sitemap 只寫規范地址
這是最容易被漏掉的一步。跳轉和 canonical 都在补,源头如果一直生成變体連結,問题會反复出現。检查模板里拼接連結的位置,確認没有多余參數、没有大小寫不一致。
不要過度归一
有些參數是有意义的,比如分頁、篩選、語言版本,這些地址的内容确實不同,不能一律合並成一條。判断标准很简單:去掉參數後,頁面主体内容是否一致。一致就归拢,不一致就保留,並按各自的方式管理抓取。
改完之後的观察
調整生效需要時間。可以在接下来的抓取日誌里,按之前聚合出的變体路径再看一遍:變体地址的請求是否在减少,規范地址的請求是否稳定出現。如果變体還在被大量抓取,多半是某個入口仍在輸出舊地址,回到内鏈和 Sitemap 再核對一遍即可。