1. 引言 (Introduction)
本章介绍 URI 的基本概念, 设计考虑和语法记法.
概览 (Overview)
统一资源标识符 (Uniform Resource Identifier, URI) 提供了一种简单且可扩展的资源标识方式.
历史背景:
- 源自万维网全球信息计划引入的概念.
- 这些标识符的使用可以追溯到 1990 年.
- 本文档废止 RFC 2396, 并合并 URL 和相对 URL 规范.
本规范:
- 为所有 URI 定义单一的通用语法.
- 引入 IPv6 地址语法.
- 不包括各个 URI 方案的特定语法, 这些语法在单独文档中更新.
1.1. URI 概览 (Overview of URIs)
URI 的特征
URI 的特征可以概括为三个词: 统一 (Uniform), 资源 (Resource), 标识符 (Identifier).
统一 (Uniform)
统一性的好处:
-
上下文无关: 允许不同类型的资源标识符在同一上下文中使用, 即使访问机制不同.
-
语义一致: 允许对不同类型资源标识符中的通用语法约定作统一语义解释.
-
可扩展: 允许引入新类型的资源标识符, 而不会干扰已有标识符.
-
可复用: 允许标识符在许多不同上下文中复用, 使新应用或协议能够利用已有的, 大规模且广泛使用的资源标识符集合.
示例:
http://example.com/page
ftp://example.com/file
mailto:[email protected]
All use the same generic syntax structure
资源 (Resource)
资源范围: 本规范不限制什么可以成为资源; "resource" 一词以一般意义使用, 指任何可以由 URI 标识的事物.
常见示例:
- 电子文档.
- 图像.
- 具有一致目的的信息源, 例如 "today's weather report for Los Angeles".
- 服务, 例如 HTTP-to-SMS gateway.
- 其他资源的集合.
更广义的资源:
- 人.
- 公司.
- 图书馆中的装订书籍.
- 抽象概念, 如数学运算符, 关系类型和数值.
关键点: 资源不一定能通过互联网访问.
标识符 (Identifier)
定义: 标识符体现了在其标识作用域内, 将被标识对象与所有其他事物区分开来所需的信息.
"标识"的含义:
- 指将一个资源与所有其他资源区分开来的目的.
- 不涉及该目的如何实现, 例如通过名称, 地址或上下文.
- 不应被误解为标识符定义或体现了所引用内容的身份.
- 不应假定使用 URI 的系统一定会访问被标识资源.
URI 定义: URI 是由一串字符组成的标识符, 这些字符匹配第 3 节中名为 <URI> 的语法规则.
URI 的全局性质
全局作用域: URI 具有全局作用域, 并且无论上下文如何都会被一致解释.
示例:
http://localhost/
Has the same interpretation for every user employing this reference
Even though the network interface corresponding to "localhost" may differ
Interpretation is independent of access
上下文相对性:
- 基于引用执行的动作会相对于最终用户的上下文.
- 旨在引用全局唯一事物的操作必须使用能将该资源与所有其他资源区分开的 URI.
本地上下文 URI:
file:///etc/hosts
Used only when context itself is a resource-defining aspect
E.g., online help manuals referencing files on the end-user's file system
1.1.1. 通用语法 (Generic Syntax)
方案名称 (Scheme Names)
每个 URI 都以方案名称开始 (定义见第 3.1 节), 方案名称指向一个规范, 该规范规定如何在该方案内分配标识符.
联合命名系统: URI 语法是一个联合且可扩展的命名系统, 每个方案的规范可以进一步限制使用该方案的标识符的语法和语义.
通用元素
本规范定义的 URI 语法元素包括:
- 所有 URI 方案都需要的元素.
- 许多 URI 方案共有的元素.
好处:
- 方案无关解析: 定义实现方案无关 URI 引用解析所需的语法和语义.
- 延迟处理: 允许将 URI 的方案相关处理推迟到需要时执行.
- 协议无关: 使用 URI 引用的协议和数据格式可以引用本规范, 将其作为允许语法范围的定义.
- 向前兼容: 包含尚未定义的方案.
解耦演进: 将标识方案的演进与使用 URI 的协议, 数据格式和实现的演进解耦.
通用解析器
解析能力: 通用 URI 语法的解析器可以把任何 URI 引用解析为其主要组件.
两阶段解析:
- 通用解析: 确定方案和主要组件.
- 方案特定解析: 对组件执行进一步的方案特定解析.
超集关系: 通用 URI 语法是所有 URI 方案语法的超集.
1.1.2. 示例 (Examples)
URI 示例
以下 URI 示例展示了若干 URI 方案及其通用语法组件的变化:
ftp://ftp.is.co.za/rfc/rfc1808.txt
- 方案:
ftp - 授权:
ftp.is.co.za - 路径:
/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc2396.txt
- 方案:
http - 授权:
www.ietf.org - 路径:
/rfc/rfc2396.txt
ldap://[2001:db8::7]/c=GB?objectClass?one
- 方案:
ldap - 授权:
[2001:db8::7](IPv6 地址) - 路径:
/c=GB - 查询:
objectClass?one
mailto:[email protected]
- 方案:
mailto - 路径:
[email protected]
news:comp.infosystems.www.servers.unix
- 方案:
news - 路径:
comp.infosystems.www.servers.unix
tel:+1-816-555-1212
- 方案:
tel - 路径:
+1-816-555-1212
telnet://192.0.2.16:80/
- 方案:
telnet - 授权:
192.0.2.16:80 - 路径:
/
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
- 方案:
urn - 路径:
oasis:names:specification:docbook:dtd:xml:4.1.2
1.1.3. URI, URL 和 URN
概念区别
URI 分类: URI 可以进一步划分为定位符, 名称, 或两者兼具.
URL (Uniform Resource Locator)
定义: URI 的一个子集, 除了标识资源外, 还通过描述其主要访问机制 (例如网络"位置") 提供定位资源的方法.
特征:
- 提供访问方法.
- 描述网络位置.
- 如果资源移动, 可能发生变化.
示例:
http://www.example.com/index.html
ftp://ftp.example.com/file.txt
URN (Uniform Resource Name)
定义: 历史上用于指代 "urn" 方案 [RFC2141] 下的 URI, 这些 URI 即使在资源不再存在或变得不可用时, 也要求保持全局唯一和持久.
特征:
- 持久标识符.
- 与位置无关.
- 即使资源消失也保持有效.
示例:
urn:isbn:0-486-27557-4
urn:ietf:rfc:3986
关系图
URI (Uniform Resource Identifier)
/ \
URL URN
(How to find resource) (Persistent name)
(Location-dependent) (Location-independent)
当代用法
术语简化: 目前, 最好把 "URL" 和 "URN" 看作 URI 空间内的助记词.
实践建议:
- 使用 "URI", 而不是 "URL" 或 "URN".
- 所有 URL 都是 URI.
- 所有 URN 都是 URI.
- 但并非所有 URI 都是 URL 或 URN.
1.2. 设计考虑 (Design Considerations)
URI 设计必须平衡多个目标, 其中一些目标有时会相互冲突.
1.2.1. 转录 (Transcription)
目标: URI 应能由人通过各种技术和媒介转录.
约束:
- 应简短.
- 应易于记忆.
- 应易于输入.
与其他目标的冲突:
Brevity vs Readability
http://x.co/a vs http://example.com/article
Memorability vs Global Uniqueness
http://blog vs http://username.blog.example.com
实践考虑:
- 字符集有限 (ASCII).
- 存在不区分大小写的系统.
- 需要处理特殊字符.
转录错误:
Common mistakes:
- Confusing 0 (zero) and O (letter)
- Confusing 1 (one) and l (lowercase L)
- Confusing - (hyphen) and _ (underscore)
1.2.2. 将标识与交互分离 (Separating Identification from Interaction)
原则: URI 独立于资源的访问方式来标识资源.
好处:
- 标识持久性: 访问方法改变时, 标识符仍可保持不变.
- 协议无关: 同一资源可以通过多种方法访问.
- 引用完整性: 可以引用不可访问的资源.
示例:
Identification: urn:isbn:0-486-27557-4
Access 1: http://amazon.com/dp/0486275574
Access 2: http://barnesandnoble.com/...
Access 3: Local library
非访问用途:
- 文档引用.
- 元数据标签.
- 链接关系.
- 数据标识.
1.2.3. 层次化标识符 (Hierarchical Identifiers)
层次结构: URI 语法支持层次化命名空间.
组织形式:
http://example.com/products/electronics/phones/model-x
└─Authority─┘ └────────Path Hierarchy─────────┘
好处:
- 委托管理: 允许命名授权的委托.
- 相对引用: 支持相对 URI 引用.
- 逻辑组织: 反映资源的逻辑组织.
层次示例:
/products/
/electronics/
/phones/
/model-x
/model-y
/laptops/
/clothing/
1.3. 语法记法 (Syntax Notation)
本规范使用扩充巴科斯-诺尔范式 (Augmented Backus-Naur Form, ABNF) [RFC2234] 定义 URI 语法规则.
ABNF 基础
规则格式:
rulename = elements
基本元素:
ALPHA = A-Z / a-z
DIGIT = 0-9
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
操作符:
/: 选择 (or)*: 重复 (zero or more)[ ]: 可选( ): 分组
示例:
scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
Interpretation:
- Starts with a letter
- Followed by zero or more (letter/digit/+/-/.)
关键概念摘要
URI 的三个特征
- 统一: 一致的语法和语义.
- 资源: 可以标识任何事物.
- 标识符: 具备区分和标识能力.
URI 与 URL, URN
| 概念 | 关注点 | 持久性 | 示例 |
|---|---|---|---|
| URI | 标识 | 不保证 | 所有 URI |
| URL | 位置 | 依赖位置 | http://example.com/page |
| URN | 名称 | 持久 | urn:isbn:0-486-27557-4 |
设计原则
- 可转录性: 人可以轻松输入和记忆.
- 关注点分离: 标识独立于访问.
- 层次性: 支持委托和组织.
下一章: 2. 字符 (Characters) - URI 中的字符处理和编码