同一篇文章,在服務器上只是一個文件,但在 URL 层面往往有好几種寫法。首頁可能是 example.com、example.com/、example.com/index.html;栏目頁可能是 /news 和 /news/;如果站内還混用了大小寫,/News 和 /news 在 Linux 服務器上就是两個不同的地址。
這些寫法在浏览器里看着都正常,訪客也不會察觉。但對站点运营来说,它們會把同一份内容拆成多個地址:日誌分散、内鏈指向不一、外部連結各寫各的,最後谁也说不清哪個才是這個頁面的「正主」。
先搞清楚地址是怎么分叉的
常见的分叉点其實不多,盘点一遍就能對上号:
- 大小寫:Windows 服務器不区分,Linux 服務器区分。迁移過主机的站点尤其容易出問题。
- 尾斜杠:目錄型路径(如 /news)加不加斜杠,服務器可能返回两個都通的结果。
- 預設文件名:/news/ 與 /news/index.html 指向同一份内容。
- 协议與域名:http 與 https、带 www 與不带 www,如果没做强制跳轉,就是四套地址。
- 參數變体:追踪參數、排序參數、會话 ID 拼在地址後面,同一個頁面能生成無數個 URL。
怎么盘:三步走
第一步,翻日誌
挑几篇有代表性的内容頁和栏目頁,在服務器日誌里搜關鍵詞,看同一個頁面被訪問时出現過几種路径寫法。這一步不需要工具,靠搜尋就行,但结果最真實——日誌里怎么寫,說明訪客和蜘蛛實际就是這么進来的。
第二步,手工试
拿一個地址,依次试它的各種變体:全小寫、首字母大寫、带斜杠、不带斜杠、加 index 後缀。看服務器分別返回什么狀態碼。如果几個變体都是 200,說明這些地址在搜尋引擎眼里确實是並存的多份。
第三步,對内部出口
站内鏈、導航、面包屑、Sitemap、canonical 标簽、分享按钮,這几處輸出的地址是否一致。很多站点的分叉就是從這些小地方来的:導航寫不带斜杠,Sitemap 寫带斜杠,分享按钮又多加一個參數。
規則怎么定
没有绝對正确的寫法,只有统一不统一的寫法。定規則时考虑三点:服務器环境、歷史外鏈情况、改動成本。
- 全站统一小寫,這是最省事的選擇,Linux 环境下也最稳。
- 目錄型路径统一带尾斜杠,文件型路径(如 .html、.jpg)不带。規則简單,好记好执行。
- 預設文件统一收口,/news/index.html 只保留一個入口,其余全部跳轉到選定版本。
- 协议與域名只留一套,其余 301 過去,並让内鏈全部使用最终版本。
修复的顺序
不要一上来就大批量加跳轉,容易把自己轉晕。建议按這個顺序:
- 先改内部出口:導航、正文内鏈、Sitemap、canonical,全部改成统一的最终地址。
- 再對非目标版本加 301,跳到目标版本。
- 观察一到两周日誌,看舊的寫法是否還有稳定流量進来,判断這條跳轉要不要長期保留。
- 如果某個變体還有大量外鏈指向,把跳轉保留着,不要急着撤。
改動期間不要叠加太多變量。同一時間既改 URL 規則又改模板结构,出問题时很难判断是哪一步造成的。
几個容易踩的坑
- 用 302 長期顶着。临时跳轉不是用来做地址收敛的,時間長了搜尋引擎可能仍然按原地址處理。
- 跳轉鏈套了好几层。A 跳 B,B 跳 C,每次訪問都要多走一跳,不如直接 A 跳 C。
- 靠 canonical 代替 301。canonical 是给搜尋引擎的提示信号,跳轉是给所有訪問者的确定性動作,两者职责不同,能跳就跳。
- 參數變体当成普通重复地址處理。带參數的頁面往往有自己的用途(篩選、排序),處理方式要單獨定,不要一刀切全部 301 回主頁面。
- 改完後没有回头驗證。至少隔一周再抽查一遍,確認内鏈、Sitemap、跳轉三者輸出的是同一個地址。
小结
URL 規范這件事,做的时候枯燥,收益也不像改标题那样立竿见影,但它决定了站点在日誌、内鏈和外部引用里是不是一個整齐的形象。花半天時間把地址统一到一套寫法上,後面每次看日誌、做外鏈、排查抓取異常,都會省下不少解释成本。