網站收錄

URL 里的中文、空格和特殊字符:编碼不一致會不會變成两個頁面

带中文标题的連結複製几次就可能變成百分号编碼,同一個頁面由此出現多個地址。本文說明编碼差异的常见来源、如何判断是否构成重复頁面,以及連結生成、canonical 與 sitemap 可以统一的地方。

網站收錄

URL 里的中文、空格和特殊字符:编碼不一致會不會變成两個頁面

從後台複製一條带中文标题的文章連結,粘贴到聊天工具里,再複製回来,往往就變成了 %E4%B8%AD 這样的百分号编碼。两個地址指向同一篇内容,但從 URL 字符上看完全不同。這類差异平时不影响用戶打開,却會在收錄环节留下一些需要理清的麻烦。

URL 里哪些字符會被编碼

URL 标准里只允许一小部分 ASCII 字符直接出現,其余都要轉成百分号编碼。中文、日文、空格,以及 #、?、& 這類在 URL 中有特殊含义的符号,都属于需要處理的字符。

  • 中文:按 UTF-8 轉成多個字节,再逐個寫成 %XX,一個汉字通常會變成三组编碼。
  • 空格:路径里的标准寫法是 %20。寫成加号只在查询串的某些场景下被当作空格,在路径中加号就是加号本身。
  • 井号及其後面的片段:這部分不會發给服務器,由浏览器自己處理。它不产生新的服務端請求,但複製出来容易让人誤以為是另一個地址。

同一内容出現多個地址的常见来源

  • 後台模板直接把标题拼進連結,没有做编碼。
  • 浏览器地址栏複製时自動编碼,十六進制大小寫還不固定,%E4 和 %e4 都可能出現。
  • 編輯器和表格粘贴时带進全角字符、零宽字符,肉眼看不出来。
  • 手工在 sitemap 或内鏈里寫地址,寫法跟頁面實际使用的對不上。

這些版本如果都返回 200,内容又完全一样,從抓取的角度看就是一组長得不同的地址。

會不會變成重复頁面

取决于服務端怎么處理。有的框架會把請求路径先解碼再匹配路由,中文原样和编碼形式最终落到同一個頁面;有的按原样匹配,两條路径各自返回一份内容,甚至生成两個不同的 canonical。後一種情况風險更高。

判断方法並不复杂:拿服務器日誌里實际出現的請求路径,和頁面里的 canonical、sitemap 里的地址對一遍。如果同一個内容對應多條路径,而服務器没有把它們指向同一個規范地址,就值得處理。

把编碼统一,是减少一個變量,不等于收錄一定會變好。它解决的是同一個頁面被拆成多個地址這類可控問题。

日常可以做的几件事

  • 生成連結时统一编碼一次,内部連結、導航、面包屑用同一套規則。
  • 頁面里的 canonical 固定指向编碼後的規范版本。
  • sitemap 里的地址與 canonical 保持一致,不要一處用中文一處用编碼。
  • 如果確認某些编碼版本不该單獨存在,可以用 301 指向規范地址,注意別绕成重定向鏈。
  • 定期抽查日誌里的 404 和 200,看有没有肉眼看不见的字符混進来。

容易和哪些問题混在一起

编碼差异经常和大小寫、结尾斜杠、追踪參數同时出現,但它們的處理方式並不一样:编碼是字符层面的轉換,大小寫取决于服務端是否区分,结尾斜杠往往由服務器配置决定。排查时把這几類分開看,比混在一起猜要快得多。

URL 编碼本身並不复杂,麻烦的是它散落在模板、編輯器、複製粘贴的各個环节。把生成和輸出的規則定死,後面看日誌、看索引覆盖报告时會省下不少来回。