常见問题

入口頁連結带中文或特殊字符:搜尋蜘蛛請求的到底是哪個 URL

入口頁 href 里寫中文、空格或特殊符号时,浏览器和搜尋蜘蛛實际請求的地址可能並不一样。本文說明 IRI 到 URI 的编碼過程、日誌里该怎么核對、哪些字符最容易出問题,以及入口頁、sitemap、canonical 三處寫法不一致时如何造成重复 URL。

常见問题

入口頁連結带中文或特殊字符:搜尋蜘蛛請求的到底是哪個 URL

先给结论:蜘蛛請求的是编碼後的 ASCII 地址

你在入口頁里寫 href="/tag/北京",浏览器地址栏可能顯示成中文,但真正發到服務器的請求行,路径部分已经變成了 %E5%8C%97%E4%BA%AC 這類 UTF-8 百分号编碼。搜尋蜘蛛同样遵循這套規則:先把含有非 ASCII 字符的 IRI 按頁面声明的字符编碼轉成 URI,再發起請求。所以日誌里出現一串 %E5 開头的路径,並不代表被劫持或抓错,而是正常的编碼结果。

有两点需要留意。一是编碼结果取决于頁面字符集,UTF-8 頁面编出来的字节串和 GBK 頁面完全不同;二是编碼只是传輸层的表示,連結指向的仍是同一份内容,如果服務器對两種寫法都返回 200,就等于凭空多出一個 URL。

日誌里怎么核對

  • 看原始請求行的路径部分,而不是統計工具里已经解碼過的报表。不少日誌分析工具會預設把 %XX 還原成中文,看起来像“中文地址被訪問了”,實际請求仍是编碼形式。
  • 如果服務器對未编碼的中文路径直接返回 400 或 404,說明它没有做二次解碼,蜘蛛抓到编碼地址一般不受影响;但入口頁里同时存在两種寫法时,就會各抓一次。
  • 把入口頁源碼里的 href 與日誌路径逐條對照:能對上說明跟進正常;對不上,先查是否有重定向把地址改寫成了另一種形式。

哪些字符最容易出問题

  • 空格。href 里寫 /a b.html,浏览器會补成 %20,但有些工具生成的連結會寫成加号或干脆留空,蜘蛛請求时可能直接拿到 404。
  • 方括号、花括号、竖线、反引号、尖括号。這些字符不允许直接出現在 URL 路径中,必须编碼,否則部分服務器會直接拒绝。
  • 查询串里的 & 與中文參數值。參數名和值里的中文同样要编碼,& 如果没被正确轉义,後面的參數會被截断。
  • 井号 #。它属于片段标识,根本不會發送给服務器,這一点和前几類不同,不能指望靠编碼把它變成路径的一部分。

容易造成重复 URL 的两種寫法

  1. 大小寫混用。同一路径,一處寫 %E5%8C%97,另一處寫小寫 %e5%8c%97。多數服務器视為同一地址,抓取統計里却會算成两條,判断时以服務器實际返回的規范地址為准。
  2. 路径與查询串各寫一種。/tag/北京 與 /tag/%E5%8C%97%E4%BA%AC 都返回 200,這时建议只保留一種形式,另一種做 301 到規范地址。

操作上的建议

  • 入口頁源碼尽量直接寫编碼後的地址,至少保證全站寫法统一,不要一部分頁面寫中文、一部分寫编碼。
  • sitemap 也用编碼後的形式,與頁面 href 保持一致。两邊寫法不同,等于額外送了一批地址進去。
  • 頁面里加 canonical,指向你希望保留的那一種寫法。
  • 新連結上线前先用抓取工具本地跑一次,確認請求行的路径和预期一致,再放進蜘蛛池入口頁。
一句话:蜘蛛不認“看起来好看”的中文地址,只認编碼後能直接發出去的那串字符。入口頁、sitemap、canonical 三處寫法统一,比事後去猜日誌里那串百分号是什么要省事得多。