常见問题

入口頁連結的大小寫、末尾斜杠、預設端口不一致:搜尋蜘蛛會当成几個 URL

同一批目标 URL 在入口頁里因為大小寫、末尾斜杠、預設端口、www、參數顺序等寫法差异,可能被搜尋蜘蛛当成多個地址分別抓取。本文說明哪些差异真的會分裂 URL、哪些一般不影响,並给出一套從連結解析、服務器跳轉检查到日誌比對的排查顺序和统一寫法建议。

常见問题

入口頁連結的大小寫、末尾斜杠、預設端口不一致:搜尋蜘蛛會当成几個 URL

蜘蛛池入口頁里挂的目标 URL,很多是批量生成的。同一批目标,寫法上只要有一点差別——大小寫、末尾斜杠、端口、參數顺序——就可能被搜尋蜘蛛当成几個不同的地址分別去抓。抓取预算是有限的,地址被拆散以後,想推的那一個反而迟迟不被發現。下面把常见情况拆開说。

搜尋蜘蛛處理的是字符串,不是“頁面”

搜尋蜘蛛在發現阶段拿到的就是一串字符。它先按規則把相對地址拼成绝對地址,再判断這是不是一個没见過的 URL。它不會先去打開頁面看内容是不是一样。所以两個字符串不同,就很可能進入两條獨立的抓取队列,至于最後會不會被合並,取决于後續的規范化信号,比如跳轉、canonical,這不是發現阶段能解决的。

哪些寫法差异可能真的會分裂 URL

  • 域名大小寫:域名部分不区分大小寫,Example.com 和 example.com 一般视為同一主机;但路径和查询參數区分大小寫,/Page 和 /page 在多數服務器上是两個资源。
  • 末尾斜杠:/a 與 /a/ 如果没有服務器跳轉收敛,就是两個地址,可能返回不同内容,也可能一個 200、一個 301。
  • 預設端口:http://example.com:80/a 與 http://example.com/a 语义等價,但服務器没做归一化跳轉时,日誌里會出現两種請求形式。
  • www 與非 www:最典型的一對,建议只保留一個版本,把另一個用 301 收過去。
  • 參數顺序與無意义參數:?a=1&b=2 與 ?b=2&a=1 是两個字符串;加一個只给統計用的參數,也會變成新地址。
  • 编碼寫法:空格寫成 %20 還是 +、百分号编碼用大寫還是小寫十六進制,服務器處理方式不同就可能落到不同路径上。
  • 锚点:# 後面的片段不會随請求發给服務器,通常不产生新 URL;但如果站点用前端路由,把 # 之後当路径處理,就要另算。

哪些是誤判,哪些是真問题

不是所有差异都值得處理。域名大小寫、預設端口這類,正規服務器和 CDN 一般會先做一次跳轉,實际不容易积累重复。真正容易出問题的是三種:批量生成連結时没统一規則、服務器没有對末尾斜杠和 www 做收敛、以及用參數区分内容却又不做規范化。第一種是入口頁的問题,第二種是服務器配置的問题,第三種是 URL 设計的問题。

自查顺序

  1. 從入口頁抓一批連結,统一解析成绝對地址,按主机、路径、參數排序,看是否存在同一目标的多種寫法。
  2. 對每種寫法各請求一次,看返回碼是 200 還是 301,跳轉目标是否统一。
  3. 翻服務器日誌,按路径去重統計,看同一目标是不是有多個 Path 在被抓。
  4. 检查頁面里的 rel=canonical 指向的是不是唯一版本,以及 sitemap 里放的是哪一版。
  5. 確認站内連結、入口頁連結、sitemap 三處给出的規范形式是否一致。

處理建议

入口頁生成連結时就用同一個規范形式:主机统一带或不带 www、路径统一末尾斜杠風格、參數按固定顺序輸出、不要塞跟踪參數。服務器层面把變体 301 到規范地址,canonical 與 sitemap 都指向同一版。這样搜尋蜘蛛见到的就只有一個地址,抓取预算不會被摊掉。

規范化的目标不是让每個變体都能被抓,而是让同一份内容只對應一個地址。變体越多,發現越慢。