為什么同一個頁面會有多個地址
很多时候不是站外連結带来的,而是站内自己生成的。同一個頁面,在浏览器里看起来一模一样,在蜘蛛眼里却是若干個互不相干的 URL。
- 大小寫不同:/About/ 和 /about/ 在多數服務器上會被当成两個地址。
- 尾斜杠有無:/about 與 /about/ 是否合並,取决于服務器配置。
- 預設文件名:/about/ 與 /about/index.html。
- 协议與主机名:http 與 https、带 www 與不带 www 的版本同时可訪問。
- 參數顺序與無關參數:?a=1&b=2 與 ?b=2&a=1,以及後面拖着 ?from=xxx 之類的追踪參數。
- 排序、篩選、分頁參數生成的大量變体地址。
- 移動版、打印版等歷史遗留地址。
這些地址只要能被訪問、能被連結到,蜘蛛就可能把它們各自排進抓取队列。
蜘蛛不會自動替你合並
内容相同並不等于蜘蛛知道它們是同一個頁面。對抓取系統来说,每個 URL 是一條獨立记錄:各自入队、各自抓取、各自判断。由此带来的直接後果有几個:
- 抓取次數被重复消耗。同一份内容抓了五遍,本该用在其他頁面上的机會就被占掉了。
- 站内連結分散到不同版本,頁面收到的連結信号被拆成几份。
- 日誌里出現大量难以判断归属的地址,排查問题时干扰很大。
不要指望蜘蛛聪明到替你挑出規范地址。它更擅長按你给出的线索走,而不是猜你的意图。
收敛的常規做法
站内連結只輸出一個版本
這是最省事也最有效的一步。導航、面包屑、列表、正文里的内鏈,全部统一到同一種寫法:固定协议、固定主机名、固定尾斜杠規則。站内自己都不一致,外部再怎么做都很难收口。
301 與 canonical 的分工
如果某個變体地址确實存在(老連結、歷史结构),用 301 跳到規范地址更干净;如果两套地址都必须能直接訪問(例如多域名或多端),可以用 rel=canonical 指明首選版本。要注意 canonical 是提示而非强制指令,它和 301、内鏈、Sitemap 给出的信号越一致,越容易被采纳。
參數收口
排序、篩選、會话、追踪這几類參數最容易生出無穷變体,常见處理方式:
- 追踪參數在服務端识別後 301 跳回干净地址,而不是直接渲染。
- 篩選组合頁如果内容重复度很高,考虑用 robots.txt 或 noindex 收口,只保留有價值的组合。
- 保持參數顺序固定,避免同一组參數以不同顺序出現。
Sitemap 只放規范地址
Sitemap 是线索清單,不是全量清單。把變体地址也寫進去,等于主動告诉蜘蛛這些都要抓。只放規范版本,並且让它和站内連結、canonical 的指向保持一致。
服務器與跳轉也要一致
配置层面的不一致同样會制造變体。比如不同节点對同一路径返回的跳轉目标不同、http 版本没有统一跳到 https、尾斜杠處理在不同目錄規則下结果不一样。這類問题通常不會立刻暴露,而是慢慢在日誌里堆积成一批零散地址。改完規則後,最好用几條固定的測試 URL 在多节点上分別請求一次,確認返回的狀態碼和 Location 完全一致。
怎么检查有没有漏網
- 翻服務器日誌,把带參數的 URL 單獨拎出来,看占比和抓取频次是否異常。
- 看站内連結寫法是否有多種版本混用,尤其是列表頁和分頁组件。
- 抽查新發布的頁面,確認它只有一個可訪問的主地址,其他入口都指向它。
- 观察一段時間,看重复地址的抓取次數是否在下降。
URL 變体不是清理一次就結束的事。新的模板、新的參數、新的跳轉規則都可能重新制造一批地址。把统一寫法当成發布流程里的固定检查項,比事後补救轻松得多。