在服務器日誌里翻 URL 时,经常能看到同一個頁面出現好几種寫法:有的是未编碼的中文,有的是 %E4%B8%AD 這样的百分号编碼,還有的大小寫十六進制混着来。這些寫法指向的其實是一個頁面,但在抓取和收錄的视角里,它們可能被当成多個地址,需要額外做一轮合並。
中文 URL 不是不能用,麻烦在于寫法不统一
URL 本身只接受一部分 ASCII 字符,浏览器在發送請求前會把中文、空格等字符轉成百分号编碼,通常按 UTF-8 编碼字节轉換。所以浏览器地址栏里看起来是「/标簽/收錄」,到了服務器日誌里往往是一串 %E6%A0%87%E7%AD%BE。這中間只要有一环的寫法不同,同一個頁面就會多出一個「新」地址。
常见的几種分歧
- 未编碼與已编碼:站内有的連結直接寫中文,有的寫百分号编碼。
- 编碼大小寫:%e6 與 %E6 在某些系統里被视作不同的字符串。
- 编碼方式不同:UTF-8 與 GBK 编出来的百分号序列完全不一样。
- 空格的處理:路径里的空格應為 %20,寫成 + 在路径中會被当成加号本身。
编碼不统一,會带来哪些實际問题
最直接的是重复内容:同一篇正文挂在两個地址下,權重和外部連結被拆成两份,頁面自己也不清楚该以哪一個為准。其次是抓取上的浪費,蜘蛛把两個地址都抓一遍,抓取资源被用在重复劳動上。第三是维護困难,改一次内鏈要同时改两種寫法,漏掉一處就又多一條入口。
這不是致命問题,但會让本来清晰的收錄狀態變得不好判断——明明只有一個頁面,覆盖率报告里却像有两個。
空格、加号、& 這些符号要單獨留意
查询字符串里的 + 通常代表空格,但路径里的 + 就是加号,两者規則不同,混用會产生意料之外的地址。查询參數里的 & 作為分隔符出現,如果它本身就是參數值的一部分(比如标题里带 &),必须编碼成 %26,否則後面的内容會被解析成新的參數。
這類细节造成的错誤往往不是「頁面打不開」,而是「打開的是另一個頁面」,排查起来比 404 更費時間。
已经用了中文 URL,怎么把口收住
- 确定一種标准寫法,通常選百分号编碼的 UTF-8 形式,站内所有連結、導航、sitemap 都用它。
- 服務器對未编碼形式也能正常响應,必要时用 301 跳到标准形式,而不是让两種寫法都返回 200。
- 頁面上的 canonical 指向标准形式的地址,不要在不同版本上寫不同的 canonical。
- 提交 sitemap 时用标准形式,不要在 sitemap 里混入另一種寫法。
- 隔一段時間看一次日誌,確認蜘蛛請求的已经是主流形式,剩下的少量舊地址可以留着跳轉。
新頁面起名时更省事的做法
如果頁面還没上线,路径用英文、拼音或數字能省掉後面几乎所有麻烦。中文标题照样可以顯示在 title 和 H1 里,URL 不承担展示任務。
- 保持短:過長的 URL 在分享、複製、粘贴时容易被截断,也更容易寫错。
- 保持稳定:不要把發布日期、版本号、活動期次這類會變的信息放進路径。
- 保持可讀:拼音或英文關鍵詞對人和對日誌排查都友好。
- 參數從简:能用路径表達的层次就別用多层參數堆砌。
URL 编碼本身不是問题,寫法不统一才是。把同一個资源收口到一種地址上,收錄狀態才容易看清。
如果站内已经积累了不少中文 URL,不必急着全部改路径,把编碼形式统一、把 canonical 與 301 做對,通常就能解决大部分重复入口的問题。改動之後留出观察周期,再看日誌和覆盖率报告里的地址數量是否收敛。