URL 里带中文、空格或特殊符号,在實际站点中很常见:為了带上關鍵詞而使用中文路径,或者把表格、聊天记錄里的連結直接複製到後台。多數情况下搜尋引擎能够處理這類地址,真正麻烦的是同一個頁面在不同位置被寫成不一样的字符形式,抓取和索引判断因此分散。這里只讨论字符本身带来的問题,不涉及 URL 長度和參數數量的取舍。
搜尋引擎通常怎么處理這些字符
浏览器和爬虫在發出請求前,一般會把非 ASCII 字符和部分保留字符轉成百分号编碼:先按 UTF-8 拆成字节,再用 % 加十六進制表示。所以「中文」在請求行里通常看不到原字符,而是類似 %E4%B8%AD%E6%96%87 的形式。
關键在于,编碼後的十六進制字母大小寫都可以:%E4 和 %e4 指向同一個字节,但寫在連結里是两個不同字符串。對爬虫来说它們是两個 URL,可能各抓一次,也可能各自進入索引判断。
容易出問题的四種情况
一、同一地址出現大小寫不同的编碼
程序生成的連結常用小寫,人工複製或某些編輯器可能改成大寫,站内就同时存在两個版本。在抓取日誌里表現為同一路径被反复請求,在索引层面則表現為两個 URL 竞争同一份内容。
二、特殊符号没有轉义,把參數切開
URL 中允许直接出現的字符有限。&、?、#、+ 在查询串里有特定含义:# 之後的内容不會發送给服務器,& 用来分隔參數,+ 在部分解析场景下被当作空格。如果文章标题、标簽里带有這些符号又直接拼進 URL,原本一個參數會被切成两個,頁面拿到的參數不完整,輸出的内容也随之改變。
三、空格、全角标点與不可见字符
從文档、聊天工具或表格里複製連結时,首尾容易带上空格、換行、全角括号或全角逗号。肉眼几乎看不出来,但請求路径會多出一段编碼,服務器可能返回 404,或者落到一個參數為空的頁面上。
四、站内各處寫法不统一
導航、面包屑、正文内鏈、Sitemap、分享按钮各自生成 URL 的方式不同,就會出現同一個頁面在站内被指向三種寫法的情况。這本身不是字符的错,但會把上面几個問题放大,也让後續排查更难定位。
先按這個顺序排查
- 從抓取日誌里筛出對應同一内容的多條請求路径,看差异是编碼大小寫、多余的轉义字符,還是參數被截断。
- 再看這些路径是谁引用進来的:内鏈、Sitemap,還是被站外複製传播。找到引用源,問题通常就解决了一半。
- 對比頁面的 canonical、Sitemap 與實际内鏈寫法是否一致。三者不一致时,先统一成一種,再观察後續抓取是否收敛。
- 確認服務器對每種寫法都能正确返回内容,而不是 404、错誤跳轉或返回空頁面。
统一寫法的几條做法
- 新頁面尽量使用可讀的英文短路径,把中文标题留在 title 和 H1 里,减少编碼环节。
- 必须使用非 ASCII 字符时,全站统一编碼大小寫,並且由程序生成,不靠人工複製。
- 連結里的參數值一律做 URL 编碼,尤其是含 &、#、空格的值。
- 複製連結後检查首尾,去掉空格、換行和看不见的控制字符。
- Sitemap 中的 URL 與站内實际指向保持一致,避免同一頁面長期存在两個版本。
URL 的字符問题並不复杂,麻烦的是同一份内容被寫成多種形式。先让一個頁面在站内只有一個寫法,抓取和收錄的判断才有稳定的依據。