URL 里出現中文、空格或特殊符号,很多站点在浏览器里能正常打開,就預設這件事已经處理好了。但對抓取端来说,地址栏里顯示的内容和實际發出的請求路径经常不是同一個字符串。編輯、開發、服務器和日誌各看各的,收錄問题往往從這里開始。
地址栏顯示的不是請求路径
浏览器在地址栏里通常會把百分号编碼還原成可讀文字,比如把 %E4%B8%AD 顯示成“中”。人複製粘贴时可能拿到中文形式,也可能拿到编碼形式,取决于從哪里複製。但網絡請求發出时,路径必须是编碼後的形式。也就是说,同一個頁面在人的眼里是一個地址,在日誌里可能是另一個地址。
如果站点内部有的連結寫中文、有的寫编碼、有的在 sitemap 里又換一種寫法,抓取端就可能把同一個頁面当成多個 URL 来發現和抓取。
中文 URL 的编碼方式要统一
目前主流做法是使用 UTF-8 百分号编碼,也就是一個中文字符编碼成三個字节,每個字节前面加百分号,例如“中”對應 %E4%B8%AD。但一些較早的服務器或程序仍可能按 GBK 等方式解碼,導致同一個中文路径在不同环境下被解析成不同结果。
更稳妥的策略是:URL 路径尽量使用 ASCII 字符,例如拼音或英文單词;如果业務上必须保留中文,則全站统一使用 UTF-8 编碼,並且在内鏈、sitemap、canonical、重定向規則里保持同一種寫法。
空格、加号與保留字符
空格在 URL 路径里應该编碼成 %20,而不是加号。加号在查询參數里有时被解释為空格,但在路径中就是普通字符,两者混用容易出現路径對不上。
另外,& 在參數中如果不编碼,會被解析成參數分隔符,後面的内容可能被截断。# 後面的片段不會發送给服務器,因此不要把重要參數放在井号後面。
- 空格:路径中统一用 %20,不要用 +。
- &:作為參數值出現时要编碼成 %26,否則會被当成新的參數。
- #:片段僅浏览器使用,服務器和抓取端看不到。
- 保留字符:: / ? # [ ] @ ! $ & ' ( ) * + , ; = 在作為普通内容时需要编碼。
编碼不一致會带来哪些收錄問题
最常见的不是“收錄不了”,而是同一頁面出現多個 URL,導致抓取次數被分散。具体表現包括:
- 同一篇文章同时存在中文路径和百分号编碼路径,两個都被抓取。
- 百分号编碼里字母大小寫不同,例如 %e4 與 %E4,有些服務器视為不同路径。
- canonical 指向的是中文形式,而實际可訪問的是编碼形式,規范信号變弱。
- 服務器解碼失敗,返回 400 或 404,抓取端反复尝试。
- sitemap 里寫一種形式,内鏈里寫另一種形式,日誌里又出現第三種。
這些問题單獨看都不大,但會在日誌里表現為抓取次數增加、有效頁面發現變慢,排查时也容易誤判。
自查與處理顺序
發現 URL 编碼相關的問题後,可以按下面的顺序處理,先统一再收口。
- 确定規范形式。優先選擇 ASCII 路径;必须用中文时,统一為 UTF-8 百分号编碼,並明确大小寫規則。
- 检查服務器。用编碼後的 URL 直接訪問,確認返回 200,而不是 404、400 或跳轉到另一個编碼形式。
- 统一站内寫法。内鏈、導航、面包屑、sitemap、canonical 全部使用規范形式,不要混用中文和编碼。
- 查看服務器日誌。搜尋 % 開头的编碼片段,看是否出現同一路径的多種编碼形式,以及是否被反复抓取。
- 對已有多個形式的 URL 做處理。保留一個規范版本返回 200,其余用 301 指向它,或者用 canonical 明确主版本。
- 检查參數编碼。中文、空格、& 出現在參數值时,確認它們被正确编碼,避免參數被截断或产生不同 URL。
參數中的中文和特殊字符
篩選、搜尋、排序參數里带中文的情况很常见。這里要注意两点:一是同一個參數值不要出現多種编碼形式;二是不要因為编碼差异产生大量只有參數值不同的 URL。對于這類頁面,可以结合參數處理規則,决定是否允许抓取、是否用 canonical 指向主版本,或者用 robots.txt 屏蔽無價值组合。
URL 编碼本身不是收錄的開關,但它决定了抓取端、服務器和日誌看到的是不是同一個地址。地址對不上,後面的质量判断和收錄判断都會受到干扰。
如果站点規模較大,可以先把编碼形式统一,再观察日誌中重复路径和抓取分布的變化。不要指望改完编碼就立刻提升收錄,它更多是减少無谓的抓取消耗,让真正需要被發現的頁面更容易被稳定訪問。