同一篇文章,浏览器地址栏里複製出来是一串带百分号的長地址,而編輯在後台填内鏈时寫的是中文字符形式。這两種寫法如果同时出現在頁面里,蜘蛛大概率會把它們当两條 URL 分別入队。URL 编碼本身不是問题,编碼前後不一致才是。
蜘蛛拿到 URL 字符串之後做了什么
蜘蛛從 HTML 中提取 href 时,通常先按原样保留字符串,之後才做解析和規范化。這個顺序意味着:寫連結时的“小随意”會先被当成不同字符串排队,之後才可能被归一化規則合並。而規范化的力度各家引擎不同,不适合当作兜底手段来依赖。
- href 里出現空格,解析常在空格處截断,連結後半段直接丢失。
- 中文、日文等非 ASCII 字符,有的抓取器會自動轉成百分号编碼,有的按原样记錄。
- 查询串里的 & 未正确轉义,參數可能被拆错,落地頁變成另一個地址。
- 同一路径大小寫混用、尾斜杠有無,都會先形成各自獨立的入口。
中文路径的两種寫法
含中文的目錄或文章标题,實际存在两種常见形態:一種是頁面源碼里直接寫中文字符,另一種是百分号编碼形式。两者在浏览器地址栏看起来差不多,但作為字符串完全不同。建议站内連結统一成一種形式;如果 CMS 自動生成,就全站保持一致,不要一部分頁面寫中文、一部分寫编碼。
核對方法:随机抽取十几個含中文的頁面,查看頁面源碼里的 href,確認是否為同一種形式;再對照服務器日誌中實际收到的請求路径。
空格、加号與查询參數
href 中的空格應编碼為 %20,直接留空會让解析在空格處断開。查询串里的加号在很多解析實現中等價于空格,如果參數值本身含有加号,通常要寫成 %2B。這類细节不處理,容易让篩選頁、站内搜尋頁产生一批形似而不同的地址,白占抓取资源。
内鏈书寫與提交的核對清單
- 抽查首頁、栏目頁、詳情頁各若干,检查 href 是否含裸空格或未轉义字符。
- 確認同一内容的連結形式统一:编碼與否、大小寫、尾斜杠三者取其一。
- 检查 Sitemap 中的 URL 與頁面内鏈是否指向同一字符串。
- 核對 canonical 與内鏈指向的地址寫法一致,避免两者各寫一套。
- 在服務器日誌中統計同一路径的不同编碼形式,出現多種即說明存在重复入口。
服務器與日誌侧的观察
有些服務器在收到编碼後的路径时不做解碼,直接按字面量去找文件,结果返回 404;而带中文的請求经過網關解碼後又能命中。同一個頁面两種结果,會让蜘蛛反复重试,也让人誤判站点狀態。
- 查看 Nginx 或 Apache 日誌中的請求行,確認记錄的是原始编碼形式還是解碼後的形式。
- 對含中文路径的站点,分別測試编碼與未编碼两種請求,比較返回碼是否一致。
- 若出現大量同類 404,優先排查連結书寫與解碼配置,而不是先怀疑蜘蛛行為。
常见誤区
有人以為“浏览器能打開就没問题”,但浏览器會自動补全和轉义,蜘蛛不會替站点做這些决定。也有人為了美观把中文路径改成拼音或英文,這本身没問题,但改版时要把舊编碼形式的地址做 301,否則舊入口會以 404 或软 404 的形式繼續被請求一段時間。
總结一句:URL 编碼是抓取鏈路上容易被忽略的一环,處理方式並不复杂——统一寫法,核對三處(頁面源碼、Sitemap、服務器日誌),發現異常返回碼及时排查。