RFC 3986 - 统一资源标识符 (URI): 通用语法
状态: 互联网标准 (STD 66)
更新: RFC 1738
废弃: RFC 2732, 2396, 1808
作者: T. Berners-Lee (W3C/MIT), R. Fielding (Day Software), L. Masinter (Adobe Systems)
发布日期: 2005年1月
摘要
统一资源标识符 (URI) 是标识抽象或物理资源的紧凑字符序列。
本规范定义了:
- 通用URI语法
- 解析可能是相对形式的URI引用的过程
- 在互联网上使用URI的指南和安全考虑
关键特点:
- URI语法定义了一个语法,它是所有有效URI的超集
- 允许实现在不知道每个可能标识符的方案特定要求的情况下解析URI引用的公共组件
- 本规范不定义URI的生成语法;该任务由每个URI方案的单独规范执行
重要性
RFC 3986是Web基础设施的核心:
- 🌐 定义URL和URN的通用语法
- 🔗 Web上所有资源定位的基础
- 📋 HTTP、HTTPS、FTP等所有协议的基础
- 🎯 相对URI解析算法
- 🔒 URI安全考虑
目录
1. Introduction (简介)
- 1.1 URI概述
- 1.1.1 通用语法
- 1.1.2 示例
- 1.1.3 URI、URL和URN
- 1.2 设计考虑
- 1.2.1 转录
- 1.2.2 将标识与交互分离
- 1.2.3 层次标识符
- 1.3 语法表示法
2. Characters (字符)
- 2.1 百分号编码
- 2.2 保留字符
- 2.3 非保留字符
- 2.4 何时编码或解码
- 2.5 识别数据
3. Syntax Components (语法组件)
- 3.1 Scheme (方案)
- 3.2 Authority (授权)
- 3.2.1 用户信息
- 3.2.2 主机
- 3.2.3 端口
- 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 语义攻击
- 7.5 敏感信息
- 7.6 罕见IP地址格式
Appendix A. Collected ABNF for URI (URI的ABNF汇总)
Appendix B. Parsing a URI Reference (解析URI引用)
Appendix C. Delimiting a URI (分隔URI)
Appendix D. Changes from RFC 2396 (相对RFC 2396的变化)
Glossary (术语表)
References (参考文献)
快速参考
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方案
| 方案 | 用途 | 示例 |
|---|---|---|
| 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
示例:
空格 → %20
中文"你" → %E4%BD%A0
相对URI类型
| 类型 | 格式 | 示例 |
|---|---|---|
| 网络路径 | //authority/path | //example.com/path |
| 绝对路径 | /path | /path/to/resource |
| 相对路径 | path | ../relative/path |
| 空路径 | ?query 或 #fragment | ?page=2 |
URI规范化
| 级别 | 操作 | 示例 |
|---|---|---|
| 语法规范化 | 大小写规范化 | HTTP:// → http:// |
| 方案规范化 | 移除默认端口 | http://example.com:80/ → http://example.com/ |
| 路径规范化 | 移除点段 | /a/b/../c/ → /a/c/ |
| 百分号编码规范化 | 解码非保留字符 | %7Euser → ~user |
URI vs URL vs URN
关系图
URI (统一资源标识符)
/ \
URL URN
(统一资源定位符) (统一资源名称)
(如何访问) (是什么)
对比
| 概念 | 定义 | 示例 |
|---|---|---|
| URI | 标识资源的字符串 | http://example.com/page |
| URL | 提供访问机制的URI | http://example.com/page |
| URN | 持久的、位置无关的标识符 | urn:isbn:0-486-27557-4 |
关键: 所有URL都是URI,所有URN都是URI,但不是所有URI都是URL或URN。
实现要点
必须实现 (MUST)
- ✅ 支持基本URI语法解析
- ✅ 正确处理百分号编码
- ✅ 实现相对URI解析算法
- ✅ 大小写不敏感的方案和主机
- ✅ 移除路径中的点段
应该实现 (SHOULD)
- ✅ URI规范化
- ✅ IRI支持(国际化资源标识符)
- ✅ IPv6地址支持
- ✅ 安全的用户信息处理
可选实现 (MAY)
- 特定方案的验证
- URI等价性比较
- 自动规范化
安全考虑
常见安全问题
-
敏感信息泄露
❌ http://user:[email protected]/
✅ 使用其他身份验证机制 -
开放重定向
❌ http://trusted.com/redirect?url=http://evil.com
✅ 验证重定向目标 -
路径遍历
❌ http://example.com/files/../../etc/passwd
✅ 规范化并验证路径 -
语义攻击
❌ http://[email protected]/
✅ 清晰显示实际主机
相关RFC
- RFC 1738: URL规范 (被更新)
- RFC 2396: URI通用语法 (被废弃)
- RFC 2732: IPv6地址格式 (被废弃)
- RFC 3987: IRI (国际化资源标识符)
- RFC 6874: IPv6区域标识符
- RFC 7230: HTTP/1.1消息语法
- RFC 8820: URI设计和所有权
在线资源
下一章: 1. Introduction (简介)
相关RFC: