同一份内容在索引里出現两個地址,最常见的来源不是内容本身,而是 URL 寫法不统一:一個带末尾斜杠、一個不带;一個全小寫、一個大小寫混用;一個指向目錄、一個指向 /index.html;或者被外鏈带進来一串跟踪參數。這類問题不會让頁面立刻掉出索引,但會分散内鏈指向、让日誌與索引統計對不上,排查收錄时很容易被带偏。
先看清“两個地址”到底差在哪
- 末尾斜杠:/guide 與 /guide/
- 大小寫:/Guide 與 /guide(在部分服務器或框架上是同一资源,在另一些上是两個不同资源)
- 預設文件名:/guide/ 與 /guide/index.html
- 协议與主机名:http 與 https、www 與不带 www
- 跟踪參數:?utm_source=… 被外鏈或分享連結带進来
把這些類型先分開,再决定用哪一條規則收敛。多數站点只需要一條原則:一個頁面只保留一種寫法。
核對顺序:從訪問返回開始
- 用带斜杠、不带斜杠、不同大小寫的地址分別訪問,看返回的是 200 還是 301、302。
- 如果多個寫法都返回 200,說明服務器没有做归一化,這就是根因,先修這里。
- 對比两邊頁面的 canonical:如果各自指向自己,等于向搜尋引擎声明這是两個獨立頁面。
- 統計内鏈:站内有多少連結指向 A 寫法,多少指向 B 寫法。
- 检查 sitemap、RSS、分頁、面包屑里出現的寫法是否一致。
- 在日誌里看蜘蛛分別抓了哪些寫法、狀態碼是什么、频率如何。
顺带確認:是不是真的同一份内容
有些寫法不同,内容其實也不同,比如篩選參數改變了列表结果、或大小寫在服務端映射到不同目錄。這種情况不属于归一化問题,硬做 301 反而會丢頁面。判断方法很简單:對比正文主体是否一致,而不只是看标题。
收敛動作,按代價從小到大
- 服務器层 301:把非規范寫法 301 到規范寫法,這是最彻底的一步,也是優先要做的。
- canonical 统一:两邊都指向規范地址,作為過渡信号。
- 内鏈與 sitemap 统一:站内不再輸出非規范寫法,sitemap 只放規范地址。
- 外鏈處理:能联系到来源的請對方改成規范地址,联系不到的靠 301 兜住。
注意:301 與 canonical 不要互相打架。如果 A 301 到 B,而 B 的 canonical 又指回 A,信号會互相抵消,收敛過程會被拉長。
收敛之後看什么
不要当天就下判断。先在日誌里確認非規范寫法被抓到时返回的是 301,再观察一段時間内该寫法的抓取量是否下降、規范寫法的抓取量是否上升。索引里舊寫法消失通常明顯滞後,几周到几個月都可以算在正常范围内。
如果几個周期過去两個寫法仍然都在索引里,回到第一步复盘:常见原因是還有没清理干净的入口,比如外站舊連結、模板里残留的拼接連結、被缓存住的分頁路径。
日常怎么少踩這個坑
- 上线前把 URL 規則定下来,寫進团队規范
- 連結由统一的生成函數輸出,避免在模板里手寫字符串
- sitemap 交给程序生成,只輸出規范地址
- 定期用日誌抽样,看是否存在非規范寫法的抓取
URL 归一化属于基础工作,做一次能省掉後面很多“為什么收錄數對不上”的解释成本。它不保證收錄结果,但能让後續的判断有據可依。