蜘蛛是按 URL 记帳的。對搜尋引擎来说,不同的 URL 就是不同的頁面,哪怕它們返回的内容完全一样。当一個頁面能通過多個地址打開,站点就會在抓取队列、抓取日誌和權重判断上重复记帳:抓取次數被摊薄,主地址的更新信号被稀释,日誌里也很难看清哪些地址才是真正需要维護的。
重复 URL 通常從哪里冒出来
多數站点不是主動制造重复地址,而是若干技術细节叠出来的:
- 协议和主机名不统一:http 與 https、带 www 與不带 www 都能訪問,且没有做跳轉。
- 路径收尾不一致:列表頁 /list 和 /list/ 都返回 200。
- 大小寫混用:服務器区分大小寫时,/About 和 /about 會算成两條地址。
- 渠道參數:utm、gclid、fbclid、ref 每投一次推廣就生成一批新地址。
- 篩選與排序參數:sort、order、filter、price_min 组合出大量地址。
- 會话類參數:sessionid、sid、時間戳、随机數。
- 功能頁面外泄:打印頁、移動版、短鏈、站内搜尋结果頁被外鏈或分享带出去。
抓取层面的實际影响
- 抓取次數被重复消耗,新内容分到的抓取机會變少。
- 日誌噪音變大,看哪些 URL 被抓過时,很难判断主地址的真實表現。
- 外鏈與内鏈權重分散到多個地址上,單個地址的連結信号被削弱。
- 回爬判断混乱:同一内容在几個地址上的更新节奏不同,蜘蛛难以確認哪個版本是最新的。
- 選错主地址:如果站点自己都没明确指向哪個版本,主地址可能不是你以為的那個。
處理顺序:硬信号在前,软信号在後
先做能让地址真正合並的動作,再做只是表態的标注。
- 能跳的一律用 301:http 到 https、非 www 到 www、带參數到不带參數,一次性跳到最终地址,避免多跳。
- 不能跳的用 canonical:指向自己確認的主地址,且主地址本身要能正常返回 200。
- 内鏈统一寫法:站内所有連結都寫成同一個形式,別在導航里用不带斜杠、正文里用带斜杠。
- 站点地图只保留主地址:把跳轉地址、參數地址、重复地址從 Sitemap 里清掉。
301 是替代關系,canonical 是建议關系。能跳轉的重复地址,優先用 301 收拢;實在不能跳轉的,再用 canonical 說明。
可以按這個顺序自查
- 從抓取日誌里統計带參數的 URL 占比,看看重复地址有没有被大量抓取。
- 用几個典型地址測試:換协议、加 www、去掉尾斜杠,看是否都跳到同一個最终地址。
- 抽查頁面的 canonical 是否自指,是否指向了實际返回 200 的主地址。
- 检查内鏈、Sitemap、RSS 里的地址寫法是否一致。
- 清理重复地址後,观察一段時間内日誌中主地址的抓取比例是否上升。
几個容易踩的坑
- 用 canonical 代替 301。两者强度不同,能跳轉的地址不做跳轉,等于让蜘蛛自己去猜。
- 用 robots 屏蔽參數地址。規則寫得太宽可能把带參數的主内容頁一起挡掉,连發現都成問题。
- 把分頁全部 canonical 到第一頁。後續頁面的内容不再被單獨看待,深层連結也失去作用。
- canonical 指向的主地址本身還會跳轉或返回非 200。指向一個打不開的地址,等于没有表態。
- 清理时不看日誌,凭感觉删。先確認哪些地址真的被蜘蛛抓過、哪些有外鏈,再决定怎么處理。
重复 URL 不會立刻让站点出問题,但它會持續消耗抓取机會,也让运营者看不清站点的真實抓取情况。把地址寫法收拢到一套規則上,是提升抓取效率里成本較低的一件事。