URL 规范化 (URL Normalization / URL Canonicalization) 是将指向同一网页的多种 URL 写法统一为一种标准格式的处理。例如「http://Example.COM/page/」「https://example.com/page」「https://example.com/page/index.html」可能都指向同一页面,但搜索引擎会将它们视为不同的 URL。
需要统一的主要元素包括:协议 (http → https)、主机名大小写 (Example.COM → example.com)、末尾斜杠 (统一有无)、默认端口号的去除 (:443 或 :80)、百分号编码的统一 (%7E → ~)、无关查询参数的去除、路径规范化 (/a/../b → /b) 等。
对于短链接服务而言,URL 规范化是核心技术。在存入数据库前对用户输入的 URL 进行规范化,可以避免同一页面生成多个短链接。如果将「https://example.com/page」和「https://example.com/page/」视为不同 URL,同一页面就会被分配两个短链接,点击统计也会被分散。
反过来,规范化做得过头会把不同的页面当成同一个 URL。最容易出问题的是去除查询参数。utm_source 这类计测用参数去掉后仍会到达同一页面,但 ?id=123、?page=2 这种决定显示内容的参数一旦去掉,就会跳到完全不同的页面。与其猜测哪些参数必须保留,不如用白名单逐一列出「可以去掉的参数」。末尾斜杠也要同样谨慎,因为有些服务器对 /page 和 /page/ 会返回不同内容,所以应在确认实际响应后再决定规范化的范围。
从 SEO 角度看,URL 规范化不当会引发重复内容问题。当同一内容可通过多个 URL 访问时,搜索引擎难以判断哪个是正式版本,导致搜索排名分散。使用 canonical 标签 (<link rel="canonical">) 指明正式版本是基本的对策。但 canonical 只是给搜索引擎的信号,并不保证一定被采纳。Google 在按影响力强弱列举正规化手段时,把重定向排在 canonical 标签之前。因此若要确实收敛到一个 URL,应先用重定向统一访问路径,再配合 canonical 标签。
RFC 3986「Uniform Resource Identifier (URI): Generic Syntax」在定义 URI 语法的同时也规定了规范化。把协议名和主机名转为小写、把百分号编码的 unreserved 字符 (字母数字与 - . _ ~) 还原为原字符 (%7E → ~)、省略协议的默认端口、解析路径中的 ../,都属于该规范之内的处理。而是否统一为 https、是否带 www、末尾斜杠向哪一侧统一,并不由 RFC 决定。这些写法未必指向同一资源,需要由站点方针和 Web 服务器配置来定,并用重定向统一到其中一种。