搜尋抓取

一個頁面多個地址:大小寫、末尾斜杠與锚点带来的重复抓取

同一個頁面如果存在大寫、末尾斜杠、index.html、參數顺序或 hash 路由等多個地址,它會以多份身份進入抓取队列,稀释抓取配額、分散權重,也让日誌統計失真。本文梳理常见的地址分叉類型,說明 301 與 canonical 的分工,以及内鏈、Sitemap、參數层面的收敛做法和驗證顺序。

搜尋抓取

一個頁面多個地址:大小寫、末尾斜杠與锚点带来的重复抓取

蜘蛛是按 URL 记帳的。同一個頁面只要能通過两個不同的地址訪問,它在抓取队列里就會占两個位置,日誌里出現两行记錄,權重也被摊成两份。很多时候抓取量看着不少,真正需要的頁面却没被覆盖,問题就出在這種地址分叉上。

常见的地址分叉有哪些

大多數分叉不是有人故意造出来的,而是服務器配置、模板寫法和編輯习惯叠加的结果。常见的有:

  • 协议與主机名:http 與 https、带 www 與不带 www 同时可訪問,组合起来就是多個地址。
  • 末尾斜杠:/list 與 /list/ 返回同一份内容。
  • 大小寫:/About 與 /about 都能打開,部分服務器和 CMS 並不区分。
  • 預設文件名:/index.html、/index.php 與目錄根地址並存。
  • 參數顺序:?a=1&b=2 與 ?b=2&a=1 指向同一结果。
  • 锚点:普通 #section 不會产生新 URL,但 #! 形式或前端 hash 路由會被当成獨立入口。

為什么要当成問题處理

抓取配額有限,地址越多,每個地址分到的回訪越少。更麻烦的是信号分散:外鏈指向的地址不统一,内鏈寫法前後不一致,蜘蛛需要反复判断哪些其實是同一頁。日誌也會變得难讀,你可能以為某個栏目只有两百個 URL,實际統計出来上千條。

如果内容本身比較單薄,重复入口還會让去重逻辑更容易誤判,站内搜尋结果里也可能出現两條几乎一样的记錄。

收敛的做法

先定一個規范地址

给每個頁面确定唯一的书寫形式:一種协议、一種主机名、末尾斜杠按目錄统一、路径统一小寫。把它寫進团队文档,比自己记住更可靠。

用 301 而不是只靠 canonical

canonical 是提示,不是指令,蜘蛛仍可能去抓那個變体。能通過服務器或 CMS 做 301 的,就優先 301 到規范地址;canonical 留给那些技術上不好跳轉的變体,比如带追踪參數的分享連結。

内鏈和 Sitemap 只寫規范地址

導航、面包屑、正文連結、分頁連結以及 Sitemap 里的 loc,统一使用規范寫法。只要其中一處随手寫成大寫或漏了斜杠,就等于又给蜘蛛開了一個入口。

把參數和锚点管起来

參數顺序能固定的就固定;追踪參數用規則在服務器端剥离或 301;前端 hash 路由如果不是业務必须,尽量不要承担主要内容入口的角色。

驗證有没有收敛干净

  1. 在服務端訪問日誌里按主机名、协议、路径大小寫分组,看還有哪些變体在被抓。
  2. 抽查主要外鏈,看它們指向的是規范地址還是變体。
  3. 用几種寫法分別請求,確認返回的是 301 而不是 200。
  4. 观察一到两周的抓取日誌,看規范地址的占比是否上升。

容易回退的地方

收敛之後最容易回退的几個点:CMS 升級後預設路径規則變了、新模板生成連結时忘了统一斜杠、編輯複製分享連結时带上了追踪參數、Sitemap 生成插件換了規則。建议把規范寫法放在模板层,用一個统一生成連結的函數或配置項来兜底,而不是靠每篇文章手動注意。

地址收敛不會让抓取量立刻翻倍,但它能让同样的抓取次數落在真正需要的頁面上,這通常比想办法催蜘蛛更有效。