站内搜尋、篩選和排序功能對訪客很友好,几秒钟就能從大量内容里挑出想要的那几條。但對爬虫来说,每一次參數组合都可能被当成一個新地址。如果没有任何约束,一個内容量並不大的站点,也能在很短時間里被「生成」出成千上萬個 URL。
參數為什么會把 URL 空間撑開
排序(?sort=price)、篩選(?color=red&size=m)、站内搜尋(?q=關鍵詞)、會话與追踪參數(?utm_source=...&sid=...),這些地址返回的頁面主体往往大同小异,却各自拥有一個獨立 URL。蜘蛛顺着站内連結一路爬下去,抓取预算被大量高度相似的頁面吃掉,真正需要及时更新的内容反而排在後面。更麻烦的是,当多個參數可以自由组合时,URL 的數量會呈乘法增長,靠人工列举很难穷尽。
參數本身不是错的。需要自查的不是「有没有參數」,而是「哪些參數组合允许被抓取、被索引」。
第一類:站内搜尋结果頁
搜尋结果頁通常是動態生成的,並且可以被任意關鍵詞触發。只要有人构造一個關鍵詞,就能得到一個此前不存在的地址。常见的情况包括:
- 搜尋框提交後直接跳到一個带查询字符串的頁面,标题里還带着用戶輸入的關鍵詞;
- 搜尋结果頁里又列出大量内容連結,蜘蛛顺着這些連結繼續深入;
- 空结果頁也返回 200 狀態碼,形成一堆内容為空的地址。
比較稳妥的做法是让结果頁保持可訪問,但不進入索引:给這類頁面加上 noindex,同时在 robots.txt 中屏蔽带搜尋參數的路径。注意這两者不要简單叠加——如果路径已经被 robots.txt 完全屏蔽,蜘蛛就看不到頁面上的 noindex 了,需要根據實际情况選一種作為主要手段。
第二類:篩選、排序與分面導航
电商、房产、招聘類站点常见多個篩選维度。三個维度各四個選項,组合出来的地址數量就相当可观。可以按下面的顺序判断:
- 核心篩選:确實對應不同内容集合、且有搜尋需求的,保留並让它們可被抓取;
- 次要篩選:内容重合度高、搜尋需求低的,指向一個代表性地址作為規范版本;
- 排序與视图參數:一般没有獨立检索價值,统一規范到預設排序的地址。
具体到實現上,canonical 是常用的收敛工具,但要保證指向的地址真實存在且返回正常,不要指到一個 404 或需要登入的頁面。
第三類:追踪、分享與临时參數
utm 參數、會话 ID、打印版本、来源标记,這些參數對訪客体驗和站内结构没有贡献,却會在連結被轉發时不断扩散。建议的做法是:
- 在服務器或應用层做參數白名單,只保留业務真正需要的參數;
- 其余參數可以让頁面正常打開,但 canonical 一律指向無參數的干净地址;
- 對明顯冗余的地址,考虑用 301 收敛到干净版本,同时確認不會连鎖跳轉。
一份可以定期执行的检查清單
- 随手在站内点几组篩選和排序组合,對照地址栏與頁面 canonical 是否一致;
- 抽查索引情况,看是否存在大量带參數的地址;
- 確認篩選、分頁的入口是普通可点击連結,而不是只能靠脚本触發;
- 检查 robots.txt 的規則有没有誤伤干净 URL,尤其是路径前缀寫得太宽的情况;
- 核對 sitemap 中是否混入了带參數的地址,只提交干净且有代表性的 URL;
- 在服務器訪問日誌里統計带參數 URL 的抓取频次和返回狀態碼,看有没有異常增長。
參數治理不是一次配置就能一劳永逸的事。栏目調整、篩選维度增加、营销活動上线,都會带来新的參數。把上面這份清單放進例行的运营节奏里,隔一段時間回看一次日誌,比在某次集中整改中改一大堆規則更有效。