做蜘蛛池的人常遇到一種情况:日誌里抓取請求看着不少,但真正被索引的入口頁並没有同步變多。追問下去,很多时候不是蜘蛛不来,而是同一個入口頁在它眼里變成了好几個不同的 URL,抓取配額被摊薄了。這一篇只讲 URL 层面的重复,不涉及内容质量判断。
一個入口頁怎么會變成多個地址
下面這些差异,在浏览器里訪問几乎没感觉,但在蜘蛛的待抓队列里往往是彼此獨立的一條:
- 协议與主机名:http 與 https、带 www 與不带 www、不同子域名(即使模板完全相同)。
- 路径大小寫:/PageA 與 /pagea。Windows、IIS 环境常不区分,Linux、Nginx 預設区分。
- 结尾斜杠:/a 與 /a/。
- 預設文档:/a/ 與 /a/index.html。
- 查询參數:?id=1、?id=1&from=x、參數顺序颠倒。纯锚点(#後面部分)通常不产生新地址。
重复地址會带来什么
- 抓取配額被摊薄:原本能爬一百個位置的量,分给了三個互為镜像的地址。
- 日誌統計失真:按路径去數“蜘蛛来過几次”,结果高估或低估都不奇怪。
- 信号分散:外鏈、内部連結分別指向不同版本时,蜘蛛收到的信息不统一。
- 维護成本上升:改一次入口頁模板,要逐個確認几個地址是否同步生效。
把 URL 收紧的几條做法
- 先定一套規則並寫下来:全站路径统一小寫、统一结尾斜杠、只保留一個主机名、统一走 https。
- 内部連結用同一套寫法。入口頁之間的互鏈、列表頁連結、sitemap 中的地址都按這套規則輸出。
- 老地址用 301 归一到正式地址,不要留 302,也不要留多跳鏈條。
- 模板里輸出 canonical,指向归一後的地址,和實际返回的内容保持一致。
- 參數能减就减。UTM、来源标记這類只用于統計的參數,不要寫進站内連結。
- 需要保留參數的頁面(分頁、篩選),固定參數顺序,避免同一组參數出現多種排列。
- 在服務器层做重寫,让 /a 直接跳到 /a/,而不是两份内容各自返回 200。
几個容易被忽略的例外
不是所有差异都该抹平。分頁參數、篩選參數往往對應真實不同的内容列表,一刀切屏蔽或全部 301 到首頁,反而让蜘蛛走不到深层頁面。判断标准其實很简單:這两個地址返回的内容是否真的不同?内容相同就归一,内容不同就保留,並让它們互相可以被發現。
另外,不要在 robots.txt 里屏蔽重复地址来图省事。被屏蔽的 URL 蜘蛛通常不會抓取,也就看不到你設定的 301 或 canonical,归一動作等于白做。合理的顺序是:先让它能抓、能跟着跳,再完成归一。
URL 归一本身不产生新内容,它做的是別让有限的抓取配額浪費在镜像地址上。在入口頁數量扩張之前,先把這套規則落到模板、站内連結和服務器配置里,比事後一個個去改要省事得多。