很多站点排查抓取問题时,會先去看連結、sitemap 和 robots,却忽略了一個更底层的問题:URL 本身的形式並不统一。同一篇内容,可能同时存在带 www 和不带 www、大寫和小寫、带尾部斜杠和不带尾部斜杠等好几種寫法。對訪客来说它們長得差不多,對搜尋蜘蛛来说却是几個不同的地址,抓取预算、外鏈權重、資料統計都會被摊薄。
URL 為什么會分叉
分叉通常不是有人故意做的,而是歷史遗留和分工不同造成的。
- 建站时用了混合大小寫的目錄名,後来改版又改成全小寫;
- CMS 生成的列表頁带尾部斜杠,詳情頁不带;
- 运营在文章里手寫連結,随手複製了浏览器地址栏里的那個版本;
- 不同渠道的推廣連結、外鏈、QR Code指向了不同變体;
- 服務器對大小寫不敏感,几種寫法都能返回 200,問题就被掩盖了。
最後一点是關键:只要服務器把各個變体都当成 200 正常返回,這個問题就不报错,只會慢慢积累。
先摸清現状:變体到底有哪些
從服務器日誌里找
把一周左右的日誌按請求路径去重、排序,重点關注含大寫字母的路径、结尾斜杠形式,以及重复出現的追踪參數。如果同一篇内容對應多條路径且都返回 200,基本可以確認存在分叉。
從站内連結里找
用站内爬取工具跑一遍,導出所有被連結到的 URL,按大小寫和斜杠形式分组。站内連結是自己完全可控的部分,也是最该先统一的部分。
從 sitemap 里找
sitemap 里如果混着两種寫法,等于主動告诉蜘蛛這里有两個地址。這個位置問题往往最集中,改起来也最直接。
定一個主形式,再统一
原則很简單:每類内容路径只保留一種寫法,其它寫法一律 301 到主形式。需要明确下来的包括:
- 域名层:是否带 www、是否强制 HTTPS,只留一個;
- 路径层:是否全站统一小寫;
- 结尾层:目錄頁用不用尾部斜杠,全站一致;
- 參數层:能去掉的追踪參數尽量去掉,必须保留的配合 canonical 處理。
定好之後要同步修改的地方不止一處:站内連結、導航與頁脚、sitemap、canonical 标簽,以及能联系到的外部連結。只改其中一處,蜘蛛仍可能從別的地方抓到舊形式。
几個容易踩的坑
- 用 302 代替 301。临时跳轉传递的信号更弱,也容易被反复抓取,能用 301 就用 301。
- 重定向鏈拉得太長。大寫版本先跳小寫,再跳去带斜杠的版本,鏈路越長越容易在中間断掉。
- canonical 指向一個還需要跳轉的地址。規范地址最好是直接返回 200 的最终形式。
- 在大小寫敏感的服務器上改错。Linux 环境下 /News/ 和 /news/ 可能是两個真實目錄,改連結前先確認實际文件路径,別把頁面改成 404。
改完之後看什么
统一 URL 形式不是一次性動作,改完要观察一段時間:日誌里變体請求是否在减少,301 是否被正常跟随,有没有冒出新的 404。收錄量和排名短期内不會立刻變化,看抓取路径是否收敛更實际。
URL 形式统一属于地基類的工作:做的时候看不出明顯效果,不做的时候,很多抓取和統計問题都找不到干净的原因。