為什么會出現“同一内容多個 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 仍可能被其他頁面連結出去,蜘蛛只能看到存在却抓不到,無法判断内容關系。
怎么检查是否收敛到位
- 從服務器日誌里按 URL 聚合,看看同一路径是否出現多種寫法。
- 抽样几個栏目,手動對比站内連結、canonical、Sitemap 三處地址是否一致。
- 观察跳轉鏈長度,確認没有多层重定向。
- 新增栏目或改版时,把 URL 規范约定寫進開發检查項。
小结
URL 規范化的目标不是消灭所有參數,而是让蜘蛛在有限時間里把精力放在會變化的正文頁上。先统一内鏈,再用 301 收敛歷史地址,最後用 canonical 與 Sitemap 做补充,通常能覆盖大部分重复抓取問题。执行後不必急着看结果,抓取行為的調整往往需要一段時間才會反映在日誌里。