站点运营里有一類很隐蔽的重复抓取問题:内容只有一份,地址却有好几個。訪問者從任意一個都能正常打開,搜尋蜘蛛却會把它們当成不同的頁面分別抓取。抓取预算被摊薄,頁面之間互相竞争,收錄和排序都容易變得不稳定。最常见的两個来源,就是 URL 大小寫和末尾斜杠。
大小寫:服務器通常不會自動帮你统一
Linux 环境下的文件系統区分大小寫,Nginx、Apache 預設也按大小寫匹配路径。這意味着 /News/2024 和 /news/2024 很可能是两個都能返回 200 的地址。如果站点地图里寫的是小寫,頁面内鏈里有几處寫成大寫,蜘蛛顺着内鏈爬,就會多抓一份。
更麻烦的是路径中段的大小寫。比如 /products/SEO-Guide 和 /products/seo-guide,看起来只是字母区別,實际就是两個 URL。爬虫不會帮你合並,它只認字符串。
末尾斜杠:目錄與文件是两種语义
带斜杠通常表示一個目錄索引,不带斜杠表示一個具体资源。大部分服務器會做自動跳轉,但這個跳轉是否發生、跳成 301 還是 302,取决于配置。有些站点两個地址都返回 200,加上頁面里的 canonical 又寫成第三種形式,問题就叠加了。
判断方法很简單:用不带參數的方式分別請求两種形式,看狀態碼和最终落点。如果两個都是 200,說明需要處理。
還有哪些類似的重复入口
- 直接暴露的 index.html、index.php、default.aspx
- 同一條路径在带與不带 www、HTTP 與 HTTPS 下都能訪問
- 分頁、排序、篩選參數拼接出的新地址
- 大小寫混用的静態资源路径,被当作獨立頁面抓取
這些情况的共同点是:它們都能返回正常内容,所以從表面上很难發現,只有看日誌或者做全站地址盘点才會暴露出来。
處理顺序建议
- 先定規范地址。给每個頁面确定唯一的寫法,包括大小寫、末尾斜杠、协议和主机名。
- 在服務器层合並。把其余形式统一 301 到規范地址,尽量一步到位,不要形成 A 到 B 再到 C 的跳轉鏈。
- 頁面上自引用 canonical。canonical 指向的地址要和實际返回的地址完全一致,包括斜杠和大小寫。
- 统一站内入口。内鏈、面包屑、站点地图、RSS、分享連結都改成規范寫法。
- 观察一段時間。從服務器日誌里看這些地址的抓取频次是否下降,舊地址是否逐渐被替換。
几個容易踩的坑
- 大小寫重定向用了 302,蜘蛛會反复回来確認,收敛更慢。
- 重定向时保留了原始路径的大小寫,導致跳轉目标又是一個新地址。
- 只在首頁做了規范化,栏目頁和詳情頁各寫各的。
- CDN 把 301 缓存住了,配置改完没刷新,前端表現和實际不一致。
- canonical 寫成绝對地址时协议或主机名和實际請求不符,等于没寫。
日常可以固定做的检查
- 新上线栏目时,检查一遍 URL 的大小寫和斜杠寫法。
- 定期抽样請求列表頁、詳情頁的變体地址,看是否都 301 到同一處。
- 站点地图生成後,检查里面有没有混入大小寫不一致的地址。
- 改版或換服務器後,重点复查伪静態規則和自動跳轉行為。
URL 規范化不是一次性任務,而是每次新增栏目、改動服務器配置时都要過一遍的基础動作。地址统一了,抓取和索引才有稳定的前提。