搜尋抓取

URL 归一化與蜘蛛抓取:大小寫、尾斜杠和預設文档带来的重复入口

同一個頁面如果存在大小寫、尾斜杠、預設文档等多種寫法,蜘蛛會把它当成多個 URL 分別抓取,抓取額度被摊薄,連結信号也被拆散。本文說明重复入口從哪来、會带来什么問题,以及用 301、canonical、内鏈和 Sitemap 统一地址的落地做法。

搜尋抓取

URL 归一化與蜘蛛抓取:大小寫、尾斜杠和預設文档带来的重复入口

同一個頁面,如果站内同时存在 /About、/about、/about/、/about/index.html 這几種寫法,在蜘蛛看来就是四個不同的地址。它們會分別進入抓取队列,分別占用抓取額度,也會让日誌里的頁面數量看起来比實际多出好几倍。URL 归一化要解决的問题,就是让一個頁面只對應一個規范地址。

哪些寫法容易被当成不同 URL

  • 大小寫差异:/About 與 /about。Linux 服務器通常区分大小寫,两者可能都能返回 200。
  • 结尾斜杠:/about 與 /about/,不少框架會同时响應。
  • 預設文档:根目錄的 / 與 /index.html、子目錄的 /about/ 與 /about/index.html。
  • 协议與主机名:http 與 https、带 www 與不带 www 混用,並且都在正常返回。
  • URL 參數:跟踪參數、排序參數、會话 ID 附加在同一個路径後面。
  • 编碼差异:中文或特殊字符直接出現在路径里,與百分号编碼形式並存。

以上情况單獨出現时影响有限,几種叠加在一起,重复入口的數量會成倍增加。

重复入口带来的實际問题

第一是抓取額度被摊薄。同一份内容被反复抓取,能分给新頁面的次數就少了,頁面量大、更新频繁的站点感受會更明顯。第二是信号分散,内鏈和外部連結如果分別指向不同寫法,頁面收到的連結信号就被拆開。第三是维護成本,Sitemap、canonical、導航連結若各寫各的,蜘蛛需要多次驗證才能確認哪個是主版本,這個過程本身也消耗請求。

归一化的目标是让蜘蛛少走重复的路,而不是让站点收錄的地址看起来更多。

把地址收敛到一種寫法

  1. 先定規范形式:明确用 https 還是 http、带不带 www、路径是否带尾斜杠,然後寫進团队規范。
  2. 服務器层做 301:把非規范寫法永久跳轉到規范地址,例如 /about/ 跳到 /about。優先用 301,不要用 302 或 JS 跳轉代替。
  3. 内鏈统一:導航、面包屑、正文連結、列表頁都使用規范地址,蜘蛛顺着連結走时就不會再次遇到變体。
  4. Sitemap 只放規范 URL,並让 canonical 指向同一個地址,三者保持一致。
  5. 參數類入口單獨處理:排序、篩選、跟踪參數能用 robots.txt 或站長平台參數設定處理的,就不要让它們進入抓取队列。

几個容易踩的邊界

301 要指向真實存在的頁面,不要出現 A 跳 B、B 又跳回 A 的循环,也不要用 301 指向一個返回 404 的地址,否則蜘蛛會認為跳轉鏈失效。服務器区分大小寫时,不要為了看起来统一,把两個内容不同的路径强行合並,先確認它們确實是同一份内容。尾斜杠規則要在服務器配置阶段解决,頁面里的 JS 跳轉對蜘蛛来说往往不算可靠信号。

怎么驗證是否已经收敛

從訪問日誌里按路径去掉參數後統計訪問次數,同一份内容如果仍有多種寫法被反复抓取,說明還有入口没處理干净。用站長工具查看規范地址的選擇结果,再用爬虫工具跑一遍站点,重点看重定向鏈的長度和 404 的来源,通常能比較快地定位到遗漏的寫法。