浏览器能打開,抓取端拿到的却不一定是同一個地址
在地址栏里輸入带中文的連結,浏览器會自動把中文轉成 %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。重定向鏈越長,抓取端越容易在中間停下。
現在可以做的几件事
- 确定一個正式寫法:要么全程用编碼形式,要么全程用原始中文,不要混着来。
- 把内鏈、canonical、sitemap、分頁連結的寫法统一成正式寫法,逐處核對。
- 翻日誌看同一内容是否被多種寫法反复抓取,這類重复抓取會占掉不少抓取量。
- 新做的頁面尽量用短、纯 ASCII 的路径,比如拼音或英文單词,後續维護成本最低。
- 已经上线很久、只有一種寫法的中文 URL,不必為了“規范”全部重做,改動带来的迁移成本往往更大。
已经存在多種寫法时,優先處理哪一類
先處理被内鏈反复指向、或者已经出現在索引里的那些變体。處理方式是頁面上放 canonical,服務端同时做 301,两條一起用更稳。只在頁面上寫 canonical 而服務端仍返回 200,抓取端大概率會把两個地址都抓一遍。
怎么確認自己站上有没有這個問题
用 site: 加编碼後的路径查一下,看索引里出現的是哪一種形式;再取一段時間的服務器日誌,按路径統計重复出現的编碼變体。如果同一篇内容在日誌里以两三種寫法被高频抓取,基本可以確認存在 URL 不一致,處理的價值也就比較明确。
URL 寫法本身不复杂,麻烦的是它會在内鏈、sitemap、外鏈、日誌里各寫各的。统一一次,後面省下来的核對成本比想象中多。