跳到主要内容

RFC 3986 - 统一资源标识符 (URI): 通用语法

  • 状态: Internet Standard
  • 发布日期: 2005 年 1 月
  • 文档流 (Stream): IETF
  • 更新: RFC1738
  • 废止: RFC1808, RFC2396, RFC2732
  • 勘误: 无勘误

摘要 (Abstract)​

统一资源标识符 (Uniform Resource Identifier, URI) 是一个紧凑的字符序列, 用于标识抽象资源或物理资源.

本规范定义了:

  • URI 通用语法
  • 解析可能采用相对形式的 URI 引用的处理过程
  • 在互联网上使用 URI 的指导原则与安全考虑

主要特性:

  • URI 语法定义了一个语法规则, 它是所有有效 URI 的超集
  • 允许实现在不了解具体方案 (scheme) 特定要求的情况下, 解析 URI 引用的通用组件
  • 不定义 URI 的生成式语法; 该任务由各个 URI 方案规范分别完成

重要性 (Importance)​

RFC 3986 是 Web 基础设施的核心:

  • 🌐 定义了 URL 与 URN 的通用语法
  • 🔗 Web 上所有资源定位的基础
  • 📋 HTTP, HTTPS, FTP 等所有协议的基础
  • 🎯 相对 URI 解析算法
  • 🔒 URI 安全考虑

目录 (Table of Contents)​

1. 引言 (Introduction)​

  • 1.1 URI 概述
    • 1.1.1 通用语法
    • 1.1.2 示例
    • 1.1.3 URI, URL 与 URN
  • 1.2 设计考虑
    • 1.2.1 转录 (Transcription)
    • 1.2.2 将标识与交互分离
    • 1.2.3 层次化标识符
  • 1.3 语法表示法

2. 字符 (Characters)​

  • 2.1 百分号编码 (Percent-Encoding)
  • 2.2 保留字符 (Reserved Characters)
  • 2.3 非保留字符 (Unreserved Characters)
  • 2.4 何时编码或解码
  • 2.5 标识数据

3. 语法组件 (Syntax Components)​

  • 3.1 方案 (Scheme)
  • 3.2 授权机构 (Authority)
    • 3.2.1 用户信息 (User Information)
    • 3.2.2 主机 (Host)
    • 3.2.3 端口 (Port)
  • 3.3 路径 (Path)
  • 3.4 查询 (Query)
  • 3.5 片段 (Fragment)

4. 用法 (Usage)​

  • 4.1 URI 引用
  • 4.2 相对引用
  • 4.3 绝对 URI
  • 4.4 同文档引用
  • 4.5 后缀引用

5. 引用解析 (Reference Resolution)​

  • 5.1 建立基准 URI
  • 5.2 相对解析
  • 5.3 组件重组
  • 5.4 引用解析示例

6. 规范化与比较 (Normalization and Comparison)​

  • 6.1 等价性
  • 6.2 比较阶梯

7. 安全考虑 (Security Considerations)​

  • 7.1 可靠性与一致性
  • 7.2 恶意构造
  • 7.3 后端转码
  • 7.4 罕见的 IP 地址格式
  • 7.5 敏感信息
  • 7.6 语义攻击

8. IANA 考虑 (IANA Considerations)​

9. 致谢 (Acknowledgements)​

10. 参考文献 (References)​

附录 (Appendices)​

快速参考 (Quick Reference)​

URI 通用语法​

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty

URI 组件示例​

  foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment

常见 URI 方案​

方案 (Scheme)用途 (Purpose)示例 (Example)
httpHTTP 协议http://www.example.com/
https安全 HTTPhttps://www.example.com/
ftp文件传输ftp://ftp.example.com/file.txt
mailto电子邮件mailto:[email protected]
file本地文件file:///path/to/file
data内联数据data:text/plain;base64,SGVsbG8=
tel电话tel:+1-800-555-1212

保留字符​

gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="

非保留字符​

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

百分号编码​

pct-encoded = "%" HEXDIG HEXDIG

Examples:
Space → %20
"你" (Chinese) → %E4%BD%A0

URI, URL 与 URN 的区别​

关系示意图​

        URI (Uniform Resource Identifier)
/ \
URL URN
(Uniform Resource Locator) (Uniform Resource Name)
(How to access) (What it is)

对比​

概念 (Concept)关注点 (Focus)持久性 (Persistence)示例 (Example)
URI标识不保证所有 URI
URL定位依赖于位置http://example.com/page
URN名称持久urn:isbn:0-486-27557-4

要点: 所有 URL 都是 URI, 所有 URN 都是 URI, 但并非所有 URI 都是 URL 或 URN.

实现要求 (Implementation Requirements)​

MUST 实现​

  • ✅ 基本的 URI 语法解析
  • ✅ 正确的百分号编码处理
  • ✅ 相对 URI 解析算法
  • ✅ 方案与主机的大小写不敏感处理
  • ✅ 路径中的点段 (dot segment) 移除

SHOULD 实现​

  • ✅ URI 规范化
  • ✅ IRI 支持 (国际化资源标识符)
  • ✅ IPv6 地址支持
  • ✅ 用户信息的安全处理

MAY 实现​

  • 方案特定的校验
  • URI 等价性比较
  • 自动规范化

相关 RFC​

  • RFC 1738: URL 规范 (已更新)
  • RFC 2396: URI 通用语法 (已废止)
  • RFC 2732: IPv6 地址格式 (已废止)
  • RFC 3987: IRI (国际化资源标识符)
  • RFC 6874: IPv6 区域标识符
  • RFC 7230: HTTP/1.1 消息语法
  • RFC 8820: URI 设计与所有权

在线资源 (Online Resources)​


下一章: 1. 引言 (Introduction)


URI Terminology (URI 术语表)​

本术语表汇总了 RFC 3986 中定义的核心概念和术语.


核心概念​

URI (Uniform Resource Identifier, 统一资源标识符)​

一个紧凑的字符序列, 用于标识抽象或物理资源. URI 提供了一种简单且可扩展的方式来标识资源.

特性:

  • Uniform (统一): 允许不同类型的资源标识符在同一上下文中使用
  • Resource (资源): 可以是任何可被标识的事物
  • Identifier (标识符): 区分一个资源与所有其他资源

URL (Uniform Resource Locator, 统一资源定位符)​

URI 的一个子集, 除了标识资源外, 还提供了访问资源的方法 (通过描述其主要访问机制).

URN (Uniform Resource Name, 统一资源名称)​

URI 的一个子集, 即使资源不再存在或不可用, URN 仍需保持全局唯一性和持久性.


URI 组件​

Scheme (方案)​

URI 的第一个组件,定义了 URI 其余部分的结构和语义.

格式: scheme:scheme-specific-part

示例: http, https, ftp, mailto, file

Authority (授权)​

由用户信息 (可选), 主机和端口 (可选) 组成的组件.

格式: [userinfo@]host[:port]

示例: user:[email protected]:8080

User Information (用户信息)​

包含用户名和可选的身份验证信息.

Host (主机)​

可以是注册名称或 IP 地址 (IPv4 或 IPv6).

Port (端口)​

与主机关联的端口号.

Path (路径)​

包含通常以分层形式组织的数据,用于标识授权范围内的资源.

示例: /path/to/resource

Query (查询)​

包含非分层数据,与路径数据一起标识资源.

格式: ?key1=value1&key2=value2

Fragment (片段)​

允许间接标识次级资源,通过引用主要资源中的某个部分.

格式: #section-name


字符编码​

Percent-Encoding (百分号编码)​

使用百分号 % 后跟两个十六进制数字来表示字符的机制.

格式: %XX (其中 XX 是十六进制数字)

示例: 空格编码为 %20

Reserved Characters (保留字符)​

在 URI 语法中具有特殊含义的字符.

通用定界符: : / ? # [ ] @

子定界符: ! $ & ' ( ) * + , ; =

Unreserved Characters (非保留字符)​

允许在 URI 中使用而无需百分号编码的字符.

字符集: A-Z a-z 0-9 - . _ ~


引用类型​

URI Reference (URI 引用)​

可以是 URI 或相对引用.

Relative Reference (相对引用)​

相对于另一个 URI (称为基础 URI) 的引用.

示例: ../resource, ./file.html, #fragment

Absolute URI (绝对 URI)​

包含方案但不包含片段的 URI.

Same-Document Reference (同文档引用)​

由空字符串或仅包含片段组件的引用.


处理操作​

Resolution (解析)​

将相对引用转换为绝对 URI 的过程.

Dereference (解引用)​

使用访问机制对 URI 的资源执行操作.

Retrieval (检索)​

使用 URI 获取其关联资源的表示形式.

Normalization (规范化)​

将 URI 转换为规范形式以便进行比较的过程.


比较方法​

Simple String Comparison (简单字符串比较)​

逐字符比较两个 URI.

Syntax-Based Normalization (基于语法的规范化)​

应用与方案无关的规范化规则.

包括:

  • 大小写规范化 (方案和主机不区分大小写)
  • 百分号编码规范化
  • 路径段规范化 (移除 . 和 ..)

Scheme-Based Normalization (基于方案的规范化)​

应用特定于方案的规则.

示例: 为 HTTP URI 添加默认端口 :80

Protocol-Based Normalization (基于协议的规范化)​

需要访问资源来确定等价性.


设计考虑​

Transcription (转录)​

URI 设计考虑了全局转录,使用有限字符集以便于跨语言和区域输入.

Hierarchical Identifiers (分层标识符)​

URI 语法按重要性递减从左到右分层组织.

Late-Binding (后期绑定)​

URI 引用的结果通常在访问时确定,可能随时间或交互的其他方面而变化.


相关术语​

  • Base URI (基础 URI): 用于解析相对引用的绝对 URI
  • Representation (表示): 资源在特定时间点的状态记录
  • Character Encoding (字符编码): 字符到八位字节的映射
  • Dot Segment (点段): 路径段 . 或 ..,用于相对路径导航