蜘蛛發現新地址的方式很朴素:字符串比對。只要 URL 有一處不同,它就可能当成另一個地址排進抓取队列。站点如果對同一份内容留下几種地址形態,结果是抓取請求被分摊、日誌里全是看不出区別的重复訪問,运维排查时也很难判断哪些是真實的新頁面。
一個内容多個地址,代價体現在哪
這種問题不會立刻爆發,而是慢慢顯形:
- 抓取次數被拆成几份,同一份内容要爬好几次才轮到真正的新頁面;
- 内鏈指向不统一时,頁面之間传递的信号被劈成几股;
- 日誌統計失真,看起来訪問量不低,實际上多數是變体地址;
- 後續做改版或下线时,漏掉某個變体,它會一直以舊形態存在。
常见的地址變体從哪来
尾斜杠與扩展名
同一個目錄頁,带斜杠和不带斜杠在很多服務器上都能正常返回内容,但它們是两個字符串。類似的情况還有 /about 與 /about.html、/about/ 與 /about/index.html。如果服務器没有做统一跳轉,两種寫法都能 200 返回,蜘蛛就會各抓一份。
大小寫混用
URL 路径部分在多數系統里区分大小寫,/Product/A1 和 /product/a1 是两個地址。站内連結、外部引用、用戶手輸各寫一種,就會出現多個版本。建议從一開始就统一小寫,並让服務器把大寫形態 301 到小寫形態。
參數顺序與跟踪參數
?a=1&b=2 與 ?b=2&a=1 在參數含义上完全一样,但地址字符串不同。再叠加来源跟踪參數、會话參數,同一頁面可以衍生出很多地址。處理思路是:能固定顺序就固定,跟踪參數尽量放在跳轉後清除,不參與頁面寻址的參數不要留在正式連結里。
协议與主机名
http 與 https、带 www 與不带 www,是四组常见组合。選定一種並做全局 301,比在每個頁面加 canonical 更彻底,也能减少蜘蛛在跳轉上浪費的時間。
收敛的具体做法
- 先定規則:把尾斜杠、大小寫、协议、主机名各定一種标准形態,寫進開發規范,別指望上线後再补。
- 服務器层 301:在 Web 服務器或 CDN 层做统一跳轉,這是覆盖面最广的一层,能拦住站外引用和用戶手輸带来的變体。
- 頁面层 canonical:對于服務器不好處理的參數變体,用 canonical 指向規范地址,作為补充信号。
- 内鏈與 Sitemap 只寫規范地址:站内所有連結、分頁連結、面包屑、Sitemap 里的地址都统一成選定的形態,不要一半带斜杠一半不带。
- 谨慎使用 robots.txt 屏蔽變体:屏蔽之後蜘蛛無法讀到跳轉和 canonical 信号,两個地址之間的關系更难合並;多數情况下用 301 比屏蔽更合适。
收敛之後怎么驗證
改完不要只看頁面能不能打開,重点看蜘蛛的行為有没有變化:
- 從抓取日誌里筛出這些變体地址,观察一段時間内的請求次數是否下降;
- 用抓取工具模拟蜘蛛訪問變体地址,確認返回的是 301 而不是 200;
- 检查站内連結,重点是導航、面包屑、分頁和頁脚,這類連結出現不一致时影响面最大;
- 观察新頁面的首次被抓時間,如果變体收敛有效,抓取請求會更多落在真正的新地址上。
地址收敛不是一次性的配置工作,而是會随着新功能上线反复出現的维護項。每次加參數、加子域名、改路由規則,都值得回头检查一遍。
简單说,能靠服務器 301 解决的,就不要留到 canonical 层面兜底;能统一在連結生成逻辑里的,就不要靠人工發現。把地址形態收窄之後,蜘蛛的抓取路径會更清晰,日誌也更容易讀懂。