很多站点在做抓取分析时會發現,日誌里同一個内容對應着好几條 URL。它們並不是重复内容,而是同一個地址的不同寫法。對浏览器来说差別不大,對蜘蛛来说却是几個獨立的入口,每一次都要單獨走一遍抓取流程。
蜘蛛只認字符串,不認頁面
蜘蛛拿到一個連結,最先判断的是“這個 URL 字符串有没有抓過”。如果没有缓存记錄,就排進队列。至于這個地址打開後是不是和站内另一個地址返回同样的内容,要等到抓回来、解析、比對之後才知道。也就是说,只要連結寫法不同,前期的請求和下载就已经發生了,後面再發現是同一頁,成本也已经付出去了。
最常见的几種“一頁多址”
- 末尾斜杠:/about 與 /about/ 在部分服務器配置下都能返回 200。
- 大小寫:/News 與 /news 是否等價,取决于服務器、CDN 與路由規則。
- 預設首頁文件:/ 、/index.html 、/index.php 同时可訪問。
- 协议與域名:http 與 https、带 www 與不带 www,各留了一份。
- 參數顺序與冗余參數:?a=1&b=2 與 ?b=2&a=1,後面再挂一串来源标记。
- 跟踪與展示參數:分享渠道、排序方式、每頁條數,往往组合出大量地址。
代價不止是多抓一次
- 抓取预算被摊薄:同一份内容占掉多條 URL 的抓取名額,真正需要更新的頁面排队更久。
- 連結權重被分散:站内指向同一頁的連結落在不同寫法上,信号被拆成几份。
- 資料失真:日誌、統計、抓取报告里同一頁出現多次,判断哪些栏目被冷落时容易誤判。
- 規范地址不稳定:搜尋引擎可能在几個寫法之間来回切換,展示出来的地址不固定。
收敛到唯一 URL 的几個動作
- 選一個規范寫法,其余寫法统一 301 到它,並且保持長期有效。
- 頁面上保留 canonical,指向規范地址,且與 301 的目标一致,不要互相矛盾。
- 内鏈、Sitemap、分享按钮、RSS 里的連結全部使用規范寫法。内鏈尤其重要,它决定了蜘蛛日常走的路。
- Sitemap 只提交規范地址,不要同时提交带斜杠和不带斜杠两個版本。
- 參數頁分類處理:能合並的合並,纯展示用的去掉,确實需要的保留並给出明确的規范指向或抓取指令。
归一化时尽量用 301,不要用 JS 跳轉或 302 临时跳轉来顶替,蜘蛛對後两者的處理不如永久跳轉干脆;也不要把整類參數用 robots.txt 全部挡掉,挡住抓取的同时,URL 的發現和後續判断也一並被挡掉了。
怎么發現自己站里的重复 URL
- 在日誌里搜同一段路径,看是否存在大小寫、末尾斜杠不同的抓取记錄。
- 检查站点抓取統計里,同一标题是否對應多個地址。
- 抽查内鏈,尤其是模板生成的連結、面包屑、分頁導航。
- 確認服務器在补斜杠或补預設文件时,返回的是 301 還是 302。
归一化不是配置一次就結束的事。新增栏目、改版模板、接入新的統計或推廣工具,都可能重新引入新的寫法,隔一段時間复查一次比較稳妥。
把 URL 寫法收敛好,不會立刻带来什么變化,但它能让蜘蛛的每一次訪問都落在真正需要被看到的頁面上,也让後續的抓取分析少掉很多噪音。