蜘蛛是按 URL 记帳的。同一個頁面只要能通過两個不同的地址訪問,它在抓取队列里就會占两個位置,日誌里出現两行记錄,權重也被摊成两份。很多时候抓取量看着不少,真正需要的頁面却没被覆盖,問题就出在這種地址分叉上。
常见的地址分叉有哪些
大多數分叉不是有人故意造出来的,而是服務器配置、模板寫法和編輯习惯叠加的结果。常见的有:
- 协议與主机名:http 與 https、带 www 與不带 www 同时可訪問,组合起来就是多個地址。
- 末尾斜杠:/list 與 /list/ 返回同一份内容。
- 大小寫:/About 與 /about 都能打開,部分服務器和 CMS 並不区分。
- 預設文件名:/index.html、/index.php 與目錄根地址並存。
- 參數顺序:?a=1&b=2 與 ?b=2&a=1 指向同一结果。
- 锚点:普通 #section 不會产生新 URL,但 #! 形式或前端 hash 路由會被当成獨立入口。
為什么要当成問题處理
抓取配額有限,地址越多,每個地址分到的回訪越少。更麻烦的是信号分散:外鏈指向的地址不统一,内鏈寫法前後不一致,蜘蛛需要反复判断哪些其實是同一頁。日誌也會變得难讀,你可能以為某個栏目只有两百個 URL,實际統計出来上千條。
如果内容本身比較單薄,重复入口還會让去重逻辑更容易誤判,站内搜尋结果里也可能出現两條几乎一样的记錄。
收敛的做法
先定一個規范地址
给每個頁面确定唯一的书寫形式:一種协议、一種主机名、末尾斜杠按目錄统一、路径统一小寫。把它寫進团队文档,比自己记住更可靠。
用 301 而不是只靠 canonical
canonical 是提示,不是指令,蜘蛛仍可能去抓那個變体。能通過服務器或 CMS 做 301 的,就優先 301 到規范地址;canonical 留给那些技術上不好跳轉的變体,比如带追踪參數的分享連結。
内鏈和 Sitemap 只寫規范地址
導航、面包屑、正文連結、分頁連結以及 Sitemap 里的 loc,统一使用規范寫法。只要其中一處随手寫成大寫或漏了斜杠,就等于又给蜘蛛開了一個入口。
把參數和锚点管起来
參數顺序能固定的就固定;追踪參數用規則在服務器端剥离或 301;前端 hash 路由如果不是业務必须,尽量不要承担主要内容入口的角色。
驗證有没有收敛干净
- 在服務端訪問日誌里按主机名、协议、路径大小寫分组,看還有哪些變体在被抓。
- 抽查主要外鏈,看它們指向的是規范地址還是變体。
- 用几種寫法分別請求,確認返回的是 301 而不是 200。
- 观察一到两周的抓取日誌,看規范地址的占比是否上升。
容易回退的地方
收敛之後最容易回退的几個点:CMS 升級後預設路径規則變了、新模板生成連結时忘了统一斜杠、編輯複製分享連結时带上了追踪參數、Sitemap 生成插件換了規則。建议把規范寫法放在模板层,用一個统一生成連結的函數或配置項来兜底,而不是靠每篇文章手動注意。
地址收敛不會让抓取量立刻翻倍,但它能让同样的抓取次數落在真正需要的頁面上,這通常比想办法催蜘蛛更有效。