Skip to main content

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方案

方案用途示例
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

示例:
空格 → %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提供访问机制的URIhttp://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等价性比较
  • 自动规范化

安全考虑

常见安全问题

  1. 敏感信息泄露

    ❌ http://user:[email protected]/
    ✅ 使用其他身份验证机制
  2. 开放重定向

    ❌ http://trusted.com/redirect?url=http://evil.com
    ✅ 验证重定向目标
  3. 路径遍历

    ❌ http://example.com/files/../../etc/passwd
    ✅ 规范化并验证路径
  4. 语义攻击

    ❌ 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: