搜尋抓取

同一份内容多個 URL:抓取分散的来源與收敛做法

站内常因大小寫、末尾斜杠、參數、协议或主机名差异,产生多個指向同一内容的 URL。蜘蛛會逐個抓取,抓取時間被摊薄,日誌也更难讀。本文梳理這些重复地址的常见来源,並给出内鏈统一、301、canonical、Sitemap 收敛的處理顺序與检查方法。

搜尋抓取

同一份内容多個 URL:抓取分散的来源與收敛做法

為什么會出現“同一内容多個 URL”

很多站点在開發阶段不會刻意区分 URL 形式,上线後随着栏目增多、參數叠加、域名切換,同一份内容往往會對應好几個可訪問地址。對用戶来说差別不大,對搜尋蜘蛛来说却是几個獨立頁面:它會分別請求、分別解析、分別安排後續抓取。

常见的重复来源

  • 大小寫差异:/About 與 /about 都返回 200。
  • 末尾斜杠:/list 與 /list/ 同时可訪問。
  • 參數叠加:?from=xxx、跟踪參數、?page=1 等預設參數。
  • 协议與主机名:http 與 https、带 www 與不带 www 並存。
  • 索引頁與内容頁:/article/123 與 /article/123.html、打印版地址。
  • 排序與视图參數:?sort=price、?view=list 之類只是展示顺序變化。

抓取分散带来的實际影响

最直接的影响是抓取時間被摊薄。假设一個列表頁有 500 條内容,每條内容存在三種 URL 形式,那么蜘蛛要抓 1500 次才覆盖得完,其中三分之二是重复劳動。對更新频繁的站点,這意味着新内容被發現的速度變慢。

其次是日誌噪声。同一個頁面的抓取记錄散落在多條 URL 上,統計訪問量、判断哪些栏目被冷落时容易誤判。此外,内鏈如果指向不统一的地址,頁面之間的推荐關系也會被分散,不利于蜘蛛理解哪個地址才是主版本。

收敛的處理顺序

1. 先统一站内連結

内鏈是蜘蛛發現 URL 最稳定的入口。把導航、面包屑、列表頁、正文推荐位里的連結统一成同一個形式,是成本最低、见效最直接的一步。相對連結與绝對連結混用时,注意 base 标簽和路径拼接是否符合预期。

2. 用 301 把舊形式導向規范地址

對于已经存在並被抓取過的重复地址,用 301 永久跳轉指向規范版本,比让它繼續返回 200 更明确。跳轉鏈尽量保持一跳,不要 A 到 B 再到 C。

3. canonical 作為补充而非替代

canonical 是一個提示,不是强制指令。它不能替代 301,也不建议跨域名滥用。

如果頁面必须保留多個可訪問地址,例如分頁或多語言版本,可以在頁头寫 canonical 指向主版本。但如果站内連結本身指向就不一致,canonical 的效果會打折扣。

4. Sitemap 只列規范 URL

Sitemap 里出現重复地址,等于主動引導蜘蛛去抓非主版本。整理一份只包含規范地址的清單,並定期核對是否與站内連結一致。

5. 參數與视图頁的處理

對排序、篩選、跟踪類參數,優先考虑在服務器端做規范化跳轉,或對無意义參數组合返回 301。确實需要保留的參數頁面,用 canonical 指向不带參數的主版本。不建议一律用 robots.txt 屏蔽,因為被屏蔽的 URL 仍可能被其他頁面連結出去,蜘蛛只能看到存在却抓不到,無法判断内容關系。

怎么检查是否收敛到位

  1. 從服務器日誌里按 URL 聚合,看看同一路径是否出現多種寫法。
  2. 抽样几個栏目,手動對比站内連結、canonical、Sitemap 三處地址是否一致。
  3. 观察跳轉鏈長度,確認没有多层重定向。
  4. 新增栏目或改版时,把 URL 規范约定寫進開發检查項。

小结

URL 規范化的目标不是消灭所有參數,而是让蜘蛛在有限時間里把精力放在會變化的正文頁上。先统一内鏈,再用 301 收敛歷史地址,最後用 canonical 與 Sitemap 做补充,通常能覆盖大部分重复抓取問题。执行後不必急着看结果,抓取行為的調整往往需要一段時間才會反映在日誌里。