URL 知识点

1
https://www.example.com:8080/path/to/resource?query=param#fragment
  • https://

    协议(Scheme)。其他常见协议:httpftp

  • www.example.com

    域名(Host/Domain)。

  • :8080

    端口(Port)。默认端口如80443等可省略,非标准端口需要显式声明。

  • /path/to/resource

    路径(Path)。

  • ?query=param

    查询参数(Query String)。以?开头,键值对形式,多个参数用&连接。

  • #fragment

    片段标识符(Fragment)。以#开头。用于在客户端定位页面内的特定部分(如锚点链接),不会发送到服务器

了解了 URL 的结构,再要了解 URL 编码也就不难了。

先放个定义: URL 编码(百分号编码)确保 URL 的正确传输和解析,主要处理保留字符、非 ASCII 字符及不安全字符。如/, ?, &, =, #, %等。

那么何时需要 URL 编码呢?

提前总结: URL 要用到某个符号的部分(例如路径中用到 / )或因为历史遗留问题禁用某个符号的,就要转码。

  • 路径(Path)
    • 允许直接使用:字母、数字、-_.~/(分隔路径)。
    • 需要转码的字符:
      • 空格 → 转为 %20+(但 + 在路径中可能被误解,建议用 %20)。
      • 其他保留字符(如 / , ?, #, [, ], @ 等)在路径中出现时需转码。
      • 非 ASCII 字符(如中文)→ 用 UTF-8 编码后转码,例如 张三%E5%BC%A0%E4%B8%89
    • 全部符号:
      • 控制字符(0x00-0x1F, 0x7F)
      • 空格(0x20 → %20
      • 双引号 "(0x22 → %22
      • 井号 #(0x23 → %23
      • 百分号 %(0x25 → %25,当不作为编码前缀时)
      • 斜杠 /(0x2F → %2F,当出现在路径段内而非分隔符时)
      • 尖括号 < >(0x3C → %3C,0x3E → %3E
      • 问号 ?(0x3F → %3F,路径结束后才是查询部分)
      • 方括号 [ ](0x5B → %5B,0x5D → %5D
      • 反斜杠 \(0x5C → %5C
      • 插入符 ^(0x5E → %5E
      • 反引号 ```(0x60 → %60
      • 花括号 { }(0x7B → %7B,0x7D → %7D
      • 竖线 |(0x7C → %7C
  • 查询参数(Query String)
    • 允许直接使用:字母、数字、-_.~
    • 需要转码的字符:
      • 空格 → 通常转为 +%20(两者都常见)。
      • 保留字符:=, &, +, ?, #, % 等。例如:
        • &%26
        • =%3D
        • ?%3F
      • 非 ASCII 字符 → UTF-8 转码,例如 张三%E5%BC%A0%E4%B8%89
    • 全部符号:
      • 控制字符
      • 空格(0x20 → %20+
      • 双引号 "(0x22 → %22
      • 井号 #(0x23 → %23
      • 百分号 %(0x25 → %25
      • 与号 &(0x26 → %26,当不作为参数分隔符时)
      • 加号 +(0x2B → %2B,当不作为空格替代符时)
      • 尖括号 < >(0x3C → %3C,0x3E → %3E
      • 等号 =(0x3D → %3D,当不作为键值分隔符时)
      • 方括号 [ ](0x5B → %5B,0x5D → %5D
      • 反斜杠 \(0x5C → %5C
      • 插入符 ^(0x5E → %5E
      • 反引号 ```(0x60 → %60
      • 花括号 { }(0x7B → %7B,0x7D → %7D
      • 竖线 |(0x7C → %7C
  • 片段标识符(Fragment,即 # 后的部分)
    • 规则与查询参数类似,但 # 本身必须转码为 %23
    • 全部符号:
      • 控制字符
      • 空格(0x20 → %20
      • 双引号 "(0x22 → %22
      • 井号 #(0x23 → %23,否则会被视为片段起始符)
      • 百分号 %(0x25 → %25
      • 尖括号 < >(0x3C → %3C,0x3E → %3E
      • 方括号 [ ](0x5B → %5B,0x5D → %5D
      • 反斜杠 \(0x5C → %5C
      • 插入符 ^(0x5E → %5E
      • 反引号 ```(0x60 → %60
      • 花括号 { }(0x7B → %7B,0x7D → %7D
      • 竖线 |(0x7C → %7C