同一個頁面在服務器上可能對應多個可訪問 URL:带 www 與不带 www、结尾有斜杠與没有斜杠、大小寫混用、預設端口顯式寫出、預設文档 index.html 是否出現。對用戶来说這些地址打開的内容一样,但對搜尋蜘蛛来说它們是不同的 URL 字符串。URL 發現阶段没有做收敛时,蜘蛛會把每個變体都放進待抓队列,抓取预算被切碎,頁面的聚合信号也可能被分散到多個地址上。
重复 URL 的常见来源
- 大小寫:路径中出現大寫字母,例如 /Product/ 與 /product/,在区分大小寫的服務器或 CDN 規則下會被视為两個地址。
- 结尾斜杠:/list 與 /list/ 同时返回 200。
- 預設端口:https://example.com 與 https://example.com:443 都能訪問。
- 預設文档:/about 與 /about/index.html 各自可訪問。
- 编碼差异:中文或空格路径出現不同百分号编碼形式,例如 %E4%B8%AD 與直接字符形式。
- 协议與主机名:http 與 https、www 與非 www 同时可解析,且没有强制跳轉。
對抓取的實际影响
蜘蛛抓取时通常按 URL 字符串去重,而不是按頁面内容去重。變体越多,同一份内容被重复請求的次數越多。表現可能是日誌里抓取量不低,但真正有抓取價值的規范 URL 請求數被摊薄;同时,如果各個變体上的 canonical、内鏈指向不一致,蜘蛛在選代表頁时會出現摇摆,入口归属變得模糊。
重复 URL 不會直接導致頁面被惩罚,但它會浪費發現和抓取资源,並让頁面信号难以集中到唯一地址上。
核對與收敛顺序
- 先在服務器或 CDN 层统一主机名與协议:把 www 與非 www、http 與 https 通過 301 跳到唯一形態;跳轉目标使用規范主机名,避免跳轉鏈。
- 處理端口與預設文档:顯式端口和預設文档訪問统一 301 到不带端口、不带預設文档的路径;確認重寫規則不會與跳轉規則互相触發循环。
- 统一路径大小寫與结尾斜杠:選擇一種形式作為規范,其余 301;注意 CDN 回源規則是否区分大小寫,避免邊缘與源站判断不一致。
- 统一站内連結:導航、面包屑、分頁、正文内鏈、分享按钮都使用規范 URL。站内連結是蜘蛛發現路径的主要来源,連結形態不统一會把變体重新带回队列。
- Sitemap 只提交規范 URL:Sitemap 中不出現預設文档、顯式端口或大小寫變体;Sitemap 里的地址應與頁面 canonical 一致。
- canonical 自引用:規范頁面 canonical 指向自身;不要多個變体互相指向形成鏈式 canonical,也不要把有效頁面 canonical 到無關頁面。
- 复查日誌:按路径去重統計變体請求,观察變体是否仍被爬取、301 落点是否稳定、規范 URL 的抓取占比是否變化。
容易忽略的服務器细节
在 Nginx、Apache 或 CDN 重寫中,路径匹配可能預設不区分大小寫,規則寫的是小寫路径,實际請求大寫时也會命中,结果重定向目标仍是同一個變体,看起来跳了但没收敛。另一種情况是邊缘节点做了一次跳轉,源站又做了一次跳轉,最终指向第三個地址。核對时可以把同一變体從多個網絡环境請求一次,记錄每一跳的狀態碼與 Location,確認终点唯一且稳定。
收尾检查
- 随机抽取若干頁面,分別請求大小寫、加斜杠、預設文档、顯式端口形式,確認都 301 到唯一規范地址。
- 確認 Sitemap、canonical、内鏈、hreflang 等声明中的 URL 形態一致。
- 观察一段時間内的抓取日誌,確認變体請求下降,規范地址的抓取趋于稳定。
URL 規范化的目标是让每個内容只有一個可抓取地址。入口收敛後,蜘蛛的發現和抓取可以更多落在真正需要抓取的頁面上,後續的内容更新也更容易被對應到正确的 URL 上。