站内連結带上 utm_、sid、sort 之類的參數,時間一長,索引里就可能多出一批“看起来像新頁面、内容其實是同一份”的 URL。處理這類問题,先別急着在 robots.txt 里一刀切,因為屏蔽和归並是两件不同的事。
一、先把參數分成三類
不同来源的參數,處理方式差別很大。核對之前先给它們归個類:
- 追踪類:utm_source、utm_medium、gclid、fbclid、ref、spm 等,只在站外跳轉或投放时出現。
- 篩選與排序類:color、size、price、sort、view、brand 等,由站内篩選器生成,可能组合出成百上千個 URL。
- 會话與狀態類:sid、sessionid、token、_t、timestamp 等,本来就不该出現在可分享的 URL 里。
二、核對顺序:從索引表現往回查
被收錄的带參 URL,先看它長什么样,再顺着来源往回收。
- 在索引报表或 site 查询里抽样,看被收錄的带參 URL 是否返回了完整正文,還是只是一個壳頁。
- 检查站内連結:分享按钮、面包屑、分頁條、篩選器是否把參數寫進了 href。
- 检查 sitemap、RSS、AMP 或接口輸出里是否直接提交了带參 URL。
- 看服務端對带參請求的响應:是 200 返回同一份正文,還是 302 跳到干净版本。
- 看 canonical 指向哪里,以及那個目标 URL 本身是否可正常抓取、是否已被收錄。
參數收敛不等于“全部 Disallow”。robots.txt 屏蔽之後,已收錄的 URL 常常仍會留在索引里,只是因為没有正文可讀而顯示成裸連結;同时爬虫讀不到 canonical,归並信号也就传不過去。
三、按類型给處理方式
追踪類
- 内鏈一律使用無參版本,追踪參數由脚本在点击时拼接,而不是寫死在 HTML 里。
- 带參版本尽量 canonical 到無參版本,两邊正文保持一致。
篩選與排序類
- 只有确實有獨立内容、也有搜尋需求的篩選组合,才允许自指 canonical 並保持可抓取。
- 其余组合归並到主列表頁;如果连归並都不合适,再用 noindex 處理,注意保留抓取權限。
會话與狀態類
- 這類參數應回到服務端解决:生成會话标识时不要寫進 URL,或對带參請求统一 302 到干净地址。
四、容易踩的坑
- 归並目标本身有問题:canonical 指到無參版本,但那個版本跳轉、报错或内容不同,信号會被忽略。
- 站内連結自己带參數:等于不断把带參版本重新暴露给爬虫,清理速度赶不上發現速度。
- noindex 與 Disallow 同时用:屏蔽抓取後 noindex 讀不到,頁面可能長期停在索引里。
- 參數顺序不统一:?a=1&b=2 與 ?b=2&a=1 會被当成两個 URL,建议在服務端對參數排序做規范化。
- 大小寫與空值參數:Color=Red 與 color=red、?size= 與不带 size,都可能各自成頁。
五、處理後怎么確認
改完之後,按周观察索引报表中带參 URL 的數量趋势,同时抽查几個典型 URL 的抓取與索引狀態。维護一份“允许索引的參數白名單”,後續新增篩選维度时先對照這份名單,避免同類問题反复出現。