不少站点為了可讀性,直接把栏目和文章路径寫成中文,例如 /帮助中心/發货說明。在浏览器地址栏里看着清楚,但一到複製、分享、日誌分析和蜘蛛抓取环节,這條地址往往變成另一副样子。搜尋蜘蛛看到的通常是被编碼後的形式,如果站内連結、站点地图、跳轉規則各寫一套,URL 發現就容易出現偏差。
同一個頁面的多種寫法
中文地址常见的存在形式有几種:UTF-8 百分号编碼、GBK 编碼、原始中文字符,以及二次编碼後的结果。這些字符串在服務器眼里未必等價,有些會被当成不同资源處理。百分号编碼還有大小寫差异,例如 %E4%B8%AD 與 %e4%b8%ad,多數环境解析结果相同,但作為 URL 字符串它們是两個值,容易衍生出重复地址。
實际執行中較常见的情形
- 站内導航輸出的是一種编碼形式,站点地图里却是另一種。
- 分享按钮或第三方統計工具把連結再次编碼,出現 %25E4 這類前缀,点開後是 404 或異常頁。
- 服務器把中文路径改寫成拼音或數字 ID,却没有做 301 跳轉,新舊地址同时可訪問。
- 後台生成連結的模板與前端渲染模板不是同一套規則,同一篇文章被引用出多個地址。
- CDN 或反向代理對编碼不做归一,同一路径在不同节点表現不一致。
统一規范比事後修补更省事
如果站点刚起步,比較稳妥的做法是尽量使用 ASCII 路径,例如拼音、英文單词加數字 ID。中文标题放在頁面里即可,不必進入 URL。若因為业務原因必须保留中文路径,那么全站需要约定一個規范形式,並让所有出口都遵守它。
- 确定字符集為 UTF-8,百分号编碼统一使用大寫字母。
- 服務端做归一化處理:把 %e4 與 %E4 视為同一路径,把二次编碼解回原始值,再统一跳轉到規范地址。
- 規范的跳轉使用 301,避免同一條内容由多個地址返回 200。
- canonical 标簽指向規范形式,且與站点地图、内鏈保持一致。
- 站点地图只提交規范地址,不要把编碼混用的地址一起提交。
- robots.txt 中的規則按規范形式书寫,否則可能看起来生效、實际没匹配上。
排查时看什么
抓取日誌里篩選带百分号的請求,观察同一栏目或文章是否以多種编碼反复出現;如果單位時間内同一内容的抓取频次明顯偏高,通常說明地址没有收敛。也可以手動用命令行請求不同编碼形式,比較返回狀態碼和 canonical 指向,看看是否存在本该跳轉却返回 200 的情况。
另外要留意站内搜尋、标簽頁和评论区的連結輸出。這類位置往往由不同模块生成,最容易把编碼規則打乱。對于确實不再使用的舊编碼地址,保留跳轉一段時間,比直接返回错誤更稳妥。
小结
中文 URL 本身不是問题,問题是同一條内容被编碼成多個地址。把编碼形式收敛到一個規范值,並让内鏈、站点地图、跳轉和 canonical 说同一句话,蜘蛛的 URL 發現路径自然會清晰一些。規范做的只是减少歧义,具体抓取和收錄仍由搜尋引擎决定。