网站收录

URL 里带中文、空格和特殊字符:编码写法对抓取与收录的影响

路径或参数里带中文、空格、特殊字符时,同一串文字会存在“人看得懂”和“机器实际传输”两种形态。本文说明编码差异如何把同一页面拆成多个入口,以及站内链接、sitemap 和自查时应统一到什么写法。

网站收录

URL 里带中文、空格和特殊字符:编码写法对抓取与收录的影响

如果 URL 路径或参数里带了中文、空格、逗号,甚至表情符号,那么同一串文字其实存在两种形态:一种是人在地址栏里看到的样子,一种是机器实际传输的样子。它们在浏览器里看着差不多,在服务器日志、抓取记录和索引里却可能不是同一个东西。先把这一点弄清楚,比急着加内链更实在。

编码不是可选装饰,而是实际传输的形态

HTTP 请求行和响应头里出现非 ASCII 字符时,浏览器和抓取工具会先把它转成百分号编码再发出去。比如“搜索”两个字,会被写成 %E6%90%9C%E7%B4%A2 这样的形式。服务器收到的是编码后的路径,后端框架再把它还原成中文字符串。也就是说,从抓取工具到服务器这一段,中文其实并不存在,存在的是一串百分号加十六进制。

问题不在于编码本身,而在于同一个页面的 URL 可能因为编码形式不同而出现多个版本。常见的差异包括:

  • 百分号后面十六进制字母的大写与小写不一致,例如 %E6 和 %e6,部分服务器会把它们当成不同路径。
  • 站内一部分链接直接写中文,另一部分写预先编码好的形式,两种写法并存。
  • 空格被编码成 %20,还是被写成加号,两种形式在查询参数里的语义可能并不相同。
  • 路径末尾多出一个看不见的空格或换行,肉眼几乎无法分辨。

站内链接统一写法,比事后合并更省事

导航、分页、面包屑、正文内链里的 URL,最好只保留一种写法。如果模板输出的链接是未编码的中文,而 sitemap 里写的是编码后的版本,蜘蛛就会把这两条当成两个入口,各抓一次,最后很可能形成两份副本。与其等它们都进了索引再去处理,不如让模板、sitemap、RSS 和接口返回的链接使用同一套拼接规则。

比较稳妥的做法是路径部分尽量使用英文、拼音或数字,把中文留在标题和正文里;确实需要在参数里携带中文时,统一由程序做一次编码,不要在模板里手写百分号,也不要一半编码、一半不编码。

几个容易忽略的特殊字符

  • &#:前者是参数分隔符,后者是片段标识符,都不会原样发给服务器。想让它们作为内容的一部分,必须先编码,否则后半截参数会被直接截断。
  • ?+:在查询串里有各自的语义,作为值出现时同样需要编码。
  • 末尾斜杠:编码问题常和斜杠问题叠加在一起,形成四种以上的变体。
  • 大小写:百分号编码的字母大小写不统一,是路径去重里最常见的漏网之鱼。

自查顺序

  1. 先用抓取工具或服务器日志看一眼蜘蛛实际请求的路径长什么样,而不是凭地址栏里的印象判断。
  2. 把 sitemap 里的 URL 与页面内链做一次对比,看是否出现编码与否、大小写、斜杠不一致的情况。
  3. 在站内搜一下同一个中文关键词,把可能生成链接的位置都找出来,逐个核对写法。
  4. 对确认重复的写法,选一个保留,其余通过服务端跳转或替换链接收敛。顺序是先改链接,再谈合并信号。
编码问题本身通常不会让页面被拒绝收录,但它会悄悄把一份内容拆成几份,消耗抓取资源,也让后续的合并判断变得更复杂。

最后提醒一句:不要为了“看起来干净”而频繁改动 URL 编码规则。已经稳定运行的形式,即便带了百分号,只要能正常响应并被抓取,就不必推倒重来。真正需要处理的,是同一个页面存在多种写法,而不是编码本身。