搜尋抓取

同一篇内容出現多個 URL:蜘蛛怎么選,站内怎么收敛

同一篇内容在蜘蛛眼里可能是好几個 URL:大小寫、尾斜杠、預設文件名、參數顺序,都會生成新的地址。本文說明這些變体是怎么進入抓取队列的、會占用哪些抓取机會,以及站内统一連結寫法、301 與 canonical 的分工、參數收口、Sitemap 只放規范地址等收敛做法,並给出几條自查思路。

搜尋抓取

同一篇内容出現多個 URL:蜘蛛怎么選,站内怎么收敛

為什么同一個頁面會有多個地址

很多时候不是站外連結带来的,而是站内自己生成的。同一個頁面,在浏览器里看起来一模一样,在蜘蛛眼里却是若干個互不相干的 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 给出的信号越一致,越容易被采纳。

參數收口

排序、篩選、會话、追踪這几類參數最容易生出無穷變体,常见處理方式:

  1. 追踪參數在服務端识別後 301 跳回干净地址,而不是直接渲染。
  2. 篩選组合頁如果内容重复度很高,考虑用 robots.txt 或 noindex 收口,只保留有價值的组合。
  3. 保持參數顺序固定,避免同一组參數以不同顺序出現。

Sitemap 只放規范地址

Sitemap 是线索清單,不是全量清單。把變体地址也寫進去,等于主動告诉蜘蛛這些都要抓。只放規范版本,並且让它和站内連結、canonical 的指向保持一致。

服務器與跳轉也要一致

配置层面的不一致同样會制造變体。比如不同节点對同一路径返回的跳轉目标不同、http 版本没有统一跳到 https、尾斜杠處理在不同目錄規則下结果不一样。這類問题通常不會立刻暴露,而是慢慢在日誌里堆积成一批零散地址。改完規則後,最好用几條固定的測試 URL 在多节点上分別請求一次,確認返回的狀態碼和 Location 完全一致。

怎么检查有没有漏網

  1. 翻服務器日誌,把带參數的 URL 單獨拎出来,看占比和抓取频次是否異常。
  2. 看站内連結寫法是否有多種版本混用,尤其是列表頁和分頁组件。
  3. 抽查新發布的頁面,確認它只有一個可訪問的主地址,其他入口都指向它。
  4. 观察一段時間,看重复地址的抓取次數是否在下降。

URL 變体不是清理一次就結束的事。新的模板、新的參數、新的跳轉規則都可能重新制造一批地址。把统一寫法当成發布流程里的固定检查項,比事後补救轻松得多。