站点做了 canonical,日誌里還是能看到带參數的地址、大寫地址、舊域名被反复抓取。這通常不是蜘蛛没看懂标簽,而是抓取和索引本来就不是同一件事:只要一個 URL 被連結、被 Sitemap 列出、被歷史记錄记住,它就有机會進入抓取队列,canonical 一般在這一步之後才起作用。
重复 URL 一般從哪几個口子冒出来
先把来源分清楚,比一上来就加标簽更有效。
- 參數:排序、篩選、追踪用的 utm、會话 ID、分頁參數。
- 同一地址的不同寫法:大小寫、结尾斜杠、預設端口、www 與非 www。
- 内容副本:打印頁、移動版、AMP、舊域名、http 與 https。
- 程序生成:站内搜尋结果頁、标簽聚合頁、日歷頁。
這些 URL 有的是被内鏈带出来的,有的是外鏈残留,有的干脆来自 Sitemap 自己寫错。
canonical 管的是合並,不是拦截
canonical 告诉蜘蛛“這一组里以哪個為准”,但它不阻止抓取。蜘蛛發現 URL、抓取、渲染,再判断是否需要合並,顺序上抓取在前。也就是说:重复 URL 被大量抓取时,真正被消耗的是抓取预算和服務器资源,canonical 只能减少後續的索引混乱,减不掉前面的請求數。
另一個容易忽略的点是:被抓不等于被索引,但“未被索引的抓取”依然占用带宽、CPU 和蜘蛛的時間片。對中小站点来说,這部分浪費往往比想象中大。
收口要從“少被發現”開始
减少重复 URL 被抓,重点是管住它們的發現路径,而不是事後贴标簽。
- 内鏈统一指向規范版本:導航、面包屑、列表頁、正文連結都指向同一種寫法。
- Sitemap 只放規范 URL:Sitemap 是主動提交入口,寫错等于邀請蜘蛛来抓重复地址。
- 能 301 的就 301:真正的舊地址、多域名、http 到 https,用跳轉比 canonical 更直接。
- robots.txt 留给無價值參數:如站内搜尋、會话參數。注意被屏蔽的頁面無法再通過 canonical 传递信号,只适合确實不需要參與索引的地址。
- hreflang 與 canonical 保持一致:多語言站点里两個标注指向不同 URL,最容易让蜘蛛来回抓。
有一種情况值得單獨提:站内搜尋頁和带排序參數的列表頁。它們内容随查询變化,蜘蛛很容易顺着一個輸入框或一個排序連結進入數量近乎無限的 URL。這類地址除了在 robots.txt 里屏蔽參數目錄,頁面上的入口也尽量改成表單提交或按钮,而不是可爬取的 a 标簽。
怎么確認收口有没有生效
看三處:服務器日誌里重复地址的抓取次數是否下降;Search Console 的“重复網頁,用戶未選定規范網頁”是否减少;“已發現 - 尚未编入索引”的數量是否回落。判断周期要给够,改完内鏈和 Sitemap 後,蜘蛛重新走一遍通常需要數周時間。
一個常见的执行顺序
- 從日誌里列出被抓次數最多的前几十個 URL,去掉參數看真實路径。
- 逐個判断:保留、合並,還是彻底不要。
- 合並的做 301,不要的用 robots.txt 挡,保留的寫進 Sitemap。
- 全站内鏈換成規范寫法,包括頁脚和侧栏里那些長期被忽略的連結。
- 過一段時間再比對日誌,確認抓取集中到了有價值的頁面上。
canonical 解决“哪一個是正本”,301 和 robots.txt 解决“會不會被請求”。把這两件事分開做,重复 URL 的抓取量才會真正降下来。