做站内巡检时,经常會看到這样一组日誌:明明是同一個頁面的内容,在日誌里却對應着好几條不同的 URL。它們全都返回 200,頁面長得一模一样,但蜘蛛每訪問一次就計一次抓取。時間長了,這些重复寫法會悄悄占掉一部分抓取量,也让日誌統計變得很难讀。
這個問题多半不是蜘蛛造成的,而是站点自己没有把 URL 收敛到一個規范版本上。下面按常见情形拆開说,再讲怎么處理。
一個頁面被拆成多條 URL 的常见情形
尾斜杠的两種寫法
/about 和 /about/ 在很多服務器配置下都能正常打開。如果服務器對两者都返回 200,蜘蛛就會把它們当作两條獨立 URL 分別抓取,即使内容完全相同。理想狀態是其中一個返回 301,跳到另一個。
大小寫不一致
/Product/123 和 /product/123 在 Linux 服務器上是两個不同的路径。如果程序内部把两者都路由到了同一篇文章,那么只要站内或外鏈里混用了两種寫法,日誌里就會出現两條 URL。
預設文件名與目錄形式
/index.html、/default.aspx 與 / 這三者,在不少站点上同时可訪問。静態站和早期 CMS 尤其容易出現,蜘蛛往往先抓到带預設文件名的版本,之後再從別處抓到目錄版本,两條都進队列。
协议與主机名
http 與 https、带 www 與不带 www,如果四種组合都能打開且不跳轉,就會形成最多四條入口。這種情况通常出現在协议切換或換域名的過渡期,處理不及时會長期存在。
參數顺序與無意义參數
?a=1&b=2 和 ?b=2&a=1 内容一致但字符串不同;再加上會话 ID、来源追踪參數,一個頁面很容易變出十几條寫法。參數顺序可以在服務端做归一化,追踪參數則更适合在頁面輸出連結时就避免。
為什么要收敛:三個實际影响
- 抓取量被摊薄。重复 URL 占用的抓取次數,原本可以分配给真正需要更新的頁面。
- 連結信号分散。指向同一内容的内部連結和外部連結被拆到多個地址上,蜘蛛也更容易在不同版本之間来回切換。
- 日誌失真。統計某個栏目被訪問了多少次、哪些頁面長期没人来,都會因為 URL 變体而算不准。
怎么收敛
- 先确定一個規范版本。通常選 https、带或不带 www 中的一個,目錄頁面统一带或不带尾斜杠,全站保持一致即可,不必纠结選哪種。
- 用 301 而不是 302。301 表達的是長期迁移,302 容易被理解為临时跳轉,蜘蛛可能保留原地址繼續訪問。
- 内鏈统一寫法。導航、正文、分頁、面包屑里出現的連結,全部指向規范版本,不要東一條西一條。
- Sitemap 只放規范 URL。提交的地址應與頁面實际規范地址一致,避免 Sitemap 自己制造重复入口。
- canonical 作為辅助,不作為主力。它可以帮助蜘蛛理解首選版本,但無法替代服務器跳轉;如果两種手段结论冲突,反而會让抓取行為更不稳定。
- 服務器层面處理。在 Nginx 或應用路由层做统一重寫,比在模板里逐條改連結更彻底,也更不容易漏。
怎么检查有没有漏
比較省事的办法是定期做一次日誌聚合:按路径分组,把大小寫、尾斜杠、預設文件名归一之後再統計訪問次數,看是否存在同一内容對應多條 URL 的情况。同时用一次全站抓取,观察有多少條 URL 的最终落点是同一個地址。
URL 收敛不是一次性任務。改版、換域名、新增栏目、換 CDN,每一步都可能重新引入新的變体,所以更适合放進固定的巡检清單里。
收敛之後,抓取量並不會立刻變多,但日誌會干净很多,也更容易判断哪些頁面是真的長期没人来。對于站点运营来说,這份干净的日誌本身就是後續優化的前提。