站内带參數的地址很常见:統計用的 utm_、来源标记、篩選、排序、分頁。對使用者来说,這些參數只是同一個頁面換了種打開方式;但對蜘蛛来说,URL 字符串不同,就是不同的地址。參數處理不当,抓取队列里會堆积大量内容高度相似的頁面,真正需要更新的頁面反而排不上。
蜘蛛如何识別带參數的 URL
蜘蛛不會去猜參數含义。它看到的是完整字符串:?utm_source=a 和 ?from=a 在它眼里是两條獨立记錄,分別入队、分別抓取、分別判定内容。只有当服務端返回相同内容、頁面上的 canonical 指向同一地址,或者存在明确的規范化跳轉时,它才可能把两者归並處理。
一個參數组合就是一個 URL,這也是篩選頁容易把抓取队列撑大的根本原因。
哪些參數通常值得放行
- 分頁類:page、p 這類參數背後是真實不同的内容片段,通常需要抓。
- 内容确實不同的篩選:例如按品類、地区切分後頁面主体内容有明顯差异,且有稳定入口。
- 語言或版本区分:需要配合 canonical 或 hreflang,让蜘蛛明白彼此關系。
- 追踪類:utm_、ref、from、spm、share 等對内容没有影响,一般不需要被抓取。
几種常见的處理方式
robots.txt 里屏蔽
寫法简單,但要注意副作用:被 Disallow 的地址,蜘蛛無法抓取頁面内容,也就看不到上面的 canonical,頁面里的内鏈也不會被繼續跟随。所以更适合用在确定不需要抓取的追踪參數上,而不是一刀切屏蔽整類路径。
服務端規范化或重定向
识別出追踪參數後,用 301 跳到無參數版本,是把地址收敛到一條线上的做法。代價是每次訪問都要多一跳,跳轉鏈不宜過長,也不要出現 A 跳 B、B 又跳回 A 的循环。另一種更轻的做法是服務端忽略這類參數,直接返回主版本内容加 canonical。
用 canonical 声明首選地址
在带參數的頁面上輸出 canonical,指向規范地址,是較温和的方式。需要清楚:canonical 是建议,不是强制命令,蜘蛛仍可能按自己的判断處理。因此 canonical 要和内鏈、Sitemap 的方向保持一致,別一邊声明首選是 A,一邊把 Sitemap 和導航都指向 B。
從内鏈源头收敛
站内連結、導航、面包屑、Sitemap 里尽量不带追踪參數。蜘蛛的發現路径主要来自連結,入口干净,带參數的地址自然就少。這比事後屏蔽更省事。
篩選與排序參數的取舍
颜色、尺寸、排序方式、每頁條數這些參數容易组合爆炸,用戶点几下就能生成上千條地址。判断标准可以简單一些:這個组合是否有獨立價值。有稳定需求、内容确實不同的篩選组合,可以保留並让地址固定;纯粹由交互产生的组合,可以让它們停留在前端交互层面,不生成可被抓取的新地址,或在 robots 里屏蔽參數组合的匹配模式。
參數顺序與大小寫
?a=1&b=2 與 ?b=2&a=1 是两個 URL,?Page=2 和 ?page=2 也是。生成連結时固定參數顺序和大小寫,能直接减少同一内容的出口數量。有條件的话,在服務端做一次規范化,把參數排序後统一處理。
分頁參數的两個细节
- 第一頁常常和列表首頁内容是同一批,可以让首頁不出現 page=1 的入口,或用 canonical 指向列表首頁。
- 翻到没有内容的深分頁,比如已超出實际頁碼,最好返回明确的狀態碼並停止輸出下一頁連結,避免蜘蛛在空頁上反复走動。
一份可执行的检查清單
- 從訪問日誌或抓取統計里,看带參數 URL 占抓取總量的比例,判断是否異常。
- 抽查带參數頁面的 canonical 是否指向正确,是否與内鏈方向一致。
- 检查站内連結是否被追踪參數污染。
- 確認 robots 里屏蔽的是不需要抓取的參數,而不是把有價值的分頁也一起挡住。
- 统一參數顺序與大小寫,减少重复出口。
- 控制分頁深度,深分頁返回明确狀態。
不必追求把所有參數都消掉,重点是让内容没有差异的參數地址不占用抓取配額。地址结构稳定、可预期之後,蜘蛛對站点的抓取节奏也更容易保持平稳。