很多站点上线时為了可讀性,直接把中文标题放進 URL,或從後台複製带空格的連結。浏览器能打開,不代表爬虫能稳定抓到。URL 编碼處理不当,會带来一系列收錄問题。
浏览器會自動编碼,但爬虫看到的是另一层
在地址栏輸入含中文或空格的 URL,浏览器通常會在發送請求前自動做百分号编碼。你複製出来的可能仍是中文,實际請求已经變成 %E4%B8%AD 之類。服務器日誌里记錄的也是编碼後的形式。如果站内連結、sitemap 和 canonical 里混用了未编碼與已编碼两種寫法,爬虫就會把它們当成不同 URL。
- 未编碼:https://example.com/标簽/網站收錄
- 编碼後:https://example.com/%E6%A0%87%E7%AD%BE/%E7%BD%91%E7%AB%99%E6%94%B6%E5%BD%95
两者在多數系統里不自動等價。若都返回 200,容易形成重复内容;若其中一種 404,則部分入口會失效。
最容易出問题的几類字符
空格與加号
空格在 URL 中應编碼為 %20,而不是直接留空或用 + 代替。+ 在查询字符串里常被解释為空格,在路径中却可能被当作普通字符。内鏈里出現空格,複製到某些編輯器或模板後會被截断。
& 與參數分隔
& 是查询參數的分隔符。如果參數值本身包含 &,必须编碼為 %26,否則爬虫會把後半段当成新參數。比如 ?q=a&b 會被解析成 q=a 和 b 两個參數,頁面内容可能完全不同。
# 片段标识
# 之後的内容不會發送给服務器,只用于頁内定位。如果誤把篩選條件寫在 # 後面,爬虫和服務器都看不到這個條件。單頁應用用 hash 路由时,要確認是否有對應的可抓取 URL。
百分号大小寫與双重编碼
%E4 與 %e4 在部分系統里被视為不同字符串。更麻烦的是双重编碼:%25E4 表示的是字面量 %E4,而不是“中”。一旦連結被多次编碼,服務器解碼後得到的可能是错誤路径。
编碼問题會怎样伤到收錄
- 同一内容對應多條 URL,權重分散,canonical 难以统一。
- sitemap 里提交的是编碼地址,站内連結指向未编碼地址,爬虫在两者之間反复切換,抓取预算被浪費。
- 日誌里同一頁面出現多種编碼形態,統計抓取频次和狀態碼时容易誤判。
- 部分编碼寫法返回 404 或 500,導致本可收錄的頁面被排除。
- 分享、外鏈和統計工具记錄不一致,後續排查来源时對不上号。
自查:從日誌和模板两头看
先不要急着批量替換。可以按下面顺序確認。
- 導出服務器日誌,篩選包含百分号、中文或空格的請求,看狀態碼分布。
- 在 Search Console 的頁面报告或索引覆盖里,找“已發現但未编入索引”“重复網頁,用戶未選定規范網頁”等狀態,观察是否集中在带编碼的 URL。
- 抽查站内連結、導航、分頁、面包屑、sitemap 和 canonical,確認同一頁面是否出現两種以上寫法。
- 用抓取工具或 curl 直接請求未编碼與已编碼地址,對比返回狀態和最终 URL。
- 检查後端路由和 CDN 規則,確認解碼顺序與重寫規則是否一致。
修复顺序:先统一,再重定向
如果已经产生两種以上可訪問寫法,比較稳妥的處理是選一個規范版本,其余 301 到規范版本。規范版本建议使用小寫、已编碼、不带多余參數的绝對地址。不要只改 sitemap,而放任站内連結繼續混用。
- 模板里的連結统一走编碼函數,避免手工拼接。
- sitemap 與 canonical 使用同一套生成逻辑。
- 服務器對错誤编碼返回 404 還是 301,要想清楚,避免把有效頁面誤伤。
- 更新後观察日誌中两種寫法的請求量是否逐步收敛。
URL 编碼不是洁癖,它决定了爬虫、服務器和統計系統看到的是不是同一個地址。先把地址统一,再谈收錄和索引,會少很多来回。
URL 里出現中文、空格和特殊符号並不必然導致不收錄,但會给抓取、去重和索引带来額外噪声。把编碼規范固定下来,让站内入口、sitemap、canonical 和日誌里的地址一致,是比反复提交更有效的做法。