蜘蛛並不理解頁面内容,它首先認的是 URL 字符串。两個字符串只要有一個字符不同,在它眼里就是两個地址。于是同一份内容可能被請求很多次,抓取額度被摊薄,日誌里也堆满了看起来相似却對不上的记錄。
归一化要解决的問题就是:让同一個頁面在站内、Sitemap、外鏈和日誌里尽量只以一種形態出現。
蜘蛛是怎么看待 URL 的
在抓取阶段,蜘蛛主要做字符串层面的處理和去重。它不會自動帮你判断 /About 和 /about 是不是同一個頁面,也不會因為參數顺序不同就認定它們是同一地址。只有当服務端返回跳轉,或者頁面上有明确的規范信号时,它才有可能把多種形態归拢到一起。
換句话说,归一化的第一道關口在服務端,第二道在内鏈輸出,第三道才是 canonical 之類的頁面級信号。
常见的归一分叉点
- 路径大小寫:/About、/about、/ABOUT 在某些服務器上都能訪問,于是變成三個 URL。
- 结尾斜杠:/list 與 /list/ 是否都返回 200,取决于服務器配置。
- 預設端口與协议:带 :80、:443 的寫法,以及 http 與 https 並存。
- 主机名:example.com 與 www.example.com,以及大小寫混寫的主机名。
- 目錄預設文件:/index.html 與 / 指向同一份内容。
- URL 编碼:中文路径可能被编碼成大寫或小寫的百分号形式;%2F 與 / 在部分环境下含义不同。
- 參數顺序:?a=1&b=2 與 ?b=2&a=1 是不同字符串。
- 空值與跟踪參數:?utm_source=xxx、?from=、?spm= 這類參數會在分享和投放中被不断追加。
- 片段标识:井号後的内容不會發给服務器,但带井号的連結如果被当成路径寫入内鏈,就會产生新的字符串。
重复發現带来的實际問题
最直接的影响是抓取资源被分散。假设一個栏目有 200 個頁面,但因為大小寫和參數组合,實际被發現的 URL 有 1500 個,蜘蛛用在真正内容上的時間就少了很多。
其次是日誌失真。做抓取分析时,如果按原始 URL 統計,很可能會得出栏目有大量頁面從未被抓取的结论,而真實情况只是同一頁面用了不同寫法。
统一做法:從服務端到内鏈
- 确定唯一形態:先定一套規則,例如全小寫路径、不带结尾斜杠、统一 https 加 www 或统一不带 www,然後全站按這套規則执行。
- 服務端做 301:把其他形態永久跳轉到規范形態,跳轉目标直接指向最终地址,不要串成多跳。
- 内鏈只輸出規范形態:導航、面包屑、列表頁、相關推荐里的連結统一寫法,避免站内自己制造分叉。
- Sitemap 只放規范 URL:清單里出現非規范寫法,等于主動把重复地址再喂给蜘蛛一次。
- 頁面加自引用 canonical:規范頁指向自己,參數頁或分頁頁指向對應主地址,作為兜底信号。
- 跟踪參數單獨處理:能去掉的在服務端重定向掉,必须保留的用 canonical 或 robots 規則控制抓取。
用日誌驗證是否生效
做法不复杂:把訪問日誌按路径聚合,再把查询參數按字典序排序後当作同一個键統計,看看同一路径下還剩多少種形態。如果某個栏目仍然出現几十種變体,說明還有入口在輸出非規范連結。
也可以抽查一段時間内被抓取的 URL,挑出带參數的记錄,人工判断哪些是有效篩選、哪些只是跟踪參數。這一步通常能很快定位到問题来源,比如某個分享组件、站内搜尋框或者舊的外鏈。
归一化不是一次性配置,而是一個持續對帳的過程。每次改版、換服務器、加投放參數之後,都值得回头看一眼日誌里的 URL 形態有没有變多。
別走過头
有些參數确實承载内容,比如篩選、排序、分頁,這類地址不该一律跳走,否則會誤伤正常頁面。同样,编碼形式的不一致如果只出現在极少數舊連結上,做一次跳轉就够了,不必為它改動整体结构。
判断标准可以简單一些:這個地址是否會被用戶或外部連結用到?會,就保留並做跳轉;不會,就让它自然消亡。