網站收錄

URL 里的中文、空格和特殊字符:抓取端會怎么處理

地址栏里看着一样的中文連結,複製出来可能變成百分号编碼。内鏈、sitemap、外鏈各寫各的,同一篇内容就有了多個地址。這篇文章讲清楚哪些字符最容易出問题、服務端该怎么接、已经存在多種寫法时先處理哪一類。

網站收錄

URL 里的中文、空格和特殊字符:抓取端會怎么處理

浏览器能打開,抓取端拿到的却不一定是同一個地址

在地址栏里輸入带中文的連結,浏览器會自動把中文轉成 %E4%B8%AD 這样的百分号编碼再發出去。你看着地址栏里還是中文,複製出来却可能是一長串编碼。同一份内容,就這样有了两種甚至更多種寫法。抓取端不認“看起来一样”,它按字符串比對 URL,寫法不同就是不同的地址。

這不會直接導致頁面不被收錄,但會让抓取和判断變得模糊:本该花在一個地址上的抓取量被分走,頁面之間的信号也被拆散。

容易出問题的几類字符

  • 空格:會被编碼成 %20,有时又被寫成 +,在部分服務端上两者含义並不相同。
  • 中文和中文标点:逗号、顿号、括号编碼後都很長,人工核對时极易看错一位。
  • # 和 ?:# 後面的内容浏览器不會發给服務器,? 後面則常被当作參數處理。
  • 大小寫:路径部分通常区分大小寫,Admin 和 admin 是两個地址。
  • &:在參數里是分隔符,出現在路径正文里需要寫成 %26。

一個頁面變成多個 URL 的常见過程

典型情况是:栏目頁里的内鏈用的是原始中文,sitemap 導出的是编碼後的形式,外部合作方複製過去的又是第三種寫法。三種寫法都返回 200,内容一模一样,抓取端會把它們当三個頁面分別抓取、分別判断。

還有一種更隐蔽的情况:服務端對编碼形式的處理不一致。訪問 /tag/搜尋引擎 和 /tag/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E 得到的结果不一样,一個正常顯示,一個 404 或跳回首頁,但两個頁面里的 canonical 又都指向同一個地址。

服務端應该怎么接

先確認服務器能正确解碼两種寫法,让它們指向同一份内容,並且只保留一個正式地址。做法通常是把非正式寫法 301 到正式寫法,注意只跳一次,不要 A 跳 B、B 又跳 C。重定向鏈越長,抓取端越容易在中間停下。

現在可以做的几件事

  1. 确定一個正式寫法:要么全程用编碼形式,要么全程用原始中文,不要混着来。
  2. 把内鏈、canonical、sitemap、分頁連結的寫法统一成正式寫法,逐處核對。
  3. 翻日誌看同一内容是否被多種寫法反复抓取,這類重复抓取會占掉不少抓取量。
  4. 新做的頁面尽量用短、纯 ASCII 的路径,比如拼音或英文單词,後續维護成本最低。
  5. 已经上线很久、只有一種寫法的中文 URL,不必為了“規范”全部重做,改動带来的迁移成本往往更大。

已经存在多種寫法时,優先處理哪一類

先處理被内鏈反复指向、或者已经出現在索引里的那些變体。處理方式是頁面上放 canonical,服務端同时做 301,两條一起用更稳。只在頁面上寫 canonical 而服務端仍返回 200,抓取端大概率會把两個地址都抓一遍。

怎么確認自己站上有没有這個問题

用 site: 加编碼後的路径查一下,看索引里出現的是哪一種形式;再取一段時間的服務器日誌,按路径統計重复出現的编碼變体。如果同一篇内容在日誌里以两三種寫法被高频抓取,基本可以確認存在 URL 不一致,處理的價值也就比較明确。

URL 寫法本身不复杂,麻烦的是它會在内鏈、sitemap、外鏈、日誌里各寫各的。统一一次,後面省下来的核對成本比想象中多。