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) |
|---|---|---|
| http | HTTP 协议 | http://www.example.com/ |
| https | 安全 HTTP | https://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 (点段): 路径段
.或..,用于相对路径导航