统一资源标识符

统一资源标识符（Uniform Resource Identifier，缩写：URI）是在互联网中唯一的字符序列，用于标识各类抽象或物理资源等对象的统一符号和编码规则，例如网页上的资源、邮件地址、电话号码、书籍和现实世界的对象如人和地点、概念等。它由三部分组成：统一资源名称（URN），作为对象的逻辑名称；统一资源属性（URC），作为对象的元数据；统一资源定位器（URL），作为对象的定位和获取。URI用于标识任何使用资源描述框架（RDF）描述的事物，例如使用网络本体语言（OWL）定义的本体中的概念，以及使用FOAF词汇描述的人，都将各自有一个独立的URI。

该种标志允许用户对网络中（一般指万维网）的资源通过特定的协议进行交互操作。URI的最常见的形式是统一资源定位符（URL），经常指定为非正式的网址。更罕见的用法是统一资源名称（URN），其目的是通过提供一种途径。用于在特定的命名空间资源的标志，以补充网址。

## 与URL和URN的关系

<image>

URI可被视为定位符（URL），名称（URN）或两者兼备。统一资源名（URN）如同一个人的名称，而统一资源定位符（URL）代表一个人的住址。换言之，URN定义某事物的身份，而URL提供查找该事物的方法。

用于标志唯一书目的ISBN系统是一个典型的URN使用范例。例如，`ISBN 0-486-27557-4`无二义性地标志出莎士比亚的戏剧《罗密欧与朱丽叶》的某一特定版本。为获得该资源并阅读该书，人们需要它的位置，也就是一个URL地址。在类Unix操作系统中，一个典型的URL地址可能是一个文件目录，例如`file:///home/username/RomeoAndJuliet.pdf`。该URL标志出存储于本地硬盘中的电子书文件。因此，URL和URN有着互补的作用。

### 技术观点

URL是一种URI，它标志一个互联网资源，并指定对其进行操作或取得该资源的方法。可能通过对主要访问手段的描述，也可能通过网络“位置”进行标志。例如，http://www.wikipedia.org/这个URL，标志一个特定资源（首页）并表示该资源的某种形式（例如以编码字符表示的，首页的HTML代码）是可以通过HTTP协议从www.wikipedia.org这个网络主机获得的。URN是基于某命名空间通过名称指定资源的URI。人们可以通过URN来指出某个资源，而无需指出其位置和获得方式。资源无需是基于互联网的。例如，URN urn:ISBN 0-395-36341-1 指定标志系统（即国际标准书号ISBN）和某资源在该系统中的唯一表示的URI。它可以允许人们在不指出其位置和获得方式的情况下谈论这本书。

技术刊物，特别是IETF和W3C发布的标准中，通常不再使用“URL”这一术语，因为很少需要区别URL和URI。但是，在非技术文献和万维网软件中，URL这一术语仍被广泛使用。此外，术语“网址”（没有正式定义）在非技术文献中时常作为URL或URI的同义词出现，虽然往往其指代的只是“http”和“https”协议。

### RFC 3305

关于URI的讨论多源于题目为《W3C/IETF URI规划联合小组报告：统一标志资源符（URI），URL和统一资源名（URN）：阐明与建议》的 RFC3305 文件。这一RFC文件描述了一个，以统一W3C和IETF内部对于各种“UR*”术语之间关系的不同看法为目的而设立的，W3C/IETF联合工作小组的工作。虽然未作为标准被这两个组织所发布，但该文件确立了上述种种共识，并就此催生了许多标准的诞生。

## 文法

URI文法由URI协议名（例如`http`、`ftp`、`mailto`、`file`），一个冒号，和协议对应的内容所构成。特定的协议定义了协议内容的语法和语义，而所有的协议都必须遵循一定的URI文法通用规则，亦即为某些专门目的保留部分特殊字符。URI文法同时也就各种原因对协议内容加以其他的限制，例如，保证各种分层协议之间的协同性。百分号编码也为URI提供附加信息。

通用URI的格式如下：

协议名://用户名:密码@主机名:端口/路径?查询参数#片段ID

### 例子

下图展示了一些 URI 示例及它们的组成部分。

## 历史

### 命名、定位与标志资源

URI与URL有着共同的历史。在1990年，提姆·柏内兹-李的关于超文本的提案间接地引入了使用URL作为一个表示超链接目标资源的短字符串的概念。当时，人们称之为“超文本名”或“文档名”。

在之后的三年半中，由于万维网的超文本标记语言核心技术、HTTP与浏览器都得到了发展，区别提供资源访问和资源标记的两种字符串的必要性开始显现。虽然其时尚未被正式定义，但“统一资源定位符”这一术语开始被用于代表前者，而后者则由“统一资源名称”所表示。

在关于定义URL和URN的争论中，人们注意到两者事实上基于同一个基础的“资源标志”的概念。在1994年6月，IETF发布了Berners-Lee的RFC 1630，（非正式地）指出了URL和URN的存在，并进一步定义了“通用资源标志符”——语义和语法由具体协议规定的类URL字符串的规范文法。此外，该RFC文档亦尝试定义了其时正被使用着的URL协议的文法，同时指出（但并未标准化）了相对URL和片段标志符的存在。

### 标准改良

1994年12月，RFC 1738 正式定义了绝对和相对URL，改进了URL文法，定义了如何解析URL为绝对形式，并更加完善地列举了其时正处于使用中的URL协议。而URN定义和文法直到1997年5月RFC 2141公布后才正式统一。

1998年8月，随着RFC 2396的发表，URI文法形成了独立的标准，同时RFC 1630和1738中关于URI和URL的许多部分也得到了修订和增补。新RFC修改了“URI”中“U”的含义：它开始代表统一（Uniform）而不再是通用（Universal）。RFC 1738中总结了既存URL协议的部分被移至另外一篇独立文档中。IANA 保留着这些协议的注册信息，而RFC 2717首次描述了注册它们的流程。

在1999年12月，RFC 2732对RFC 2396进行了小幅更新，开始允许URI包括IPv6地址。一段时间以后，在两个标准中暴露出的一些问题促使了一系列的修订草案的发展，这些草案被统称为rfc2396bis。这一由RFC 2396的共同作者引导协调的集体努力，由2005年1月RFC 3986的发布推至了顶峰。该RFC文档成为了现今（2009年）于互联网上被推荐使用的URI文法版本，并使得RFC 2396成为了历史。然而，它却并未替代现有的URL协议细节；RFC 1738继续管辖着大多数协议，除了某些已被它取而代之的场合——例如被RFC 2616改良的“HTTP”协议等。与此同时，IETF发布了RFC 3986，亦即完整的STD 66标准，标志着URI通用文法正式成官方因特网协议。

在2002年8月，RFC 3305指出，虽然术语“URL”仍被广泛地用于日常用语之中，但其本身已几乎被废弃。其现在的功用，仅是作为对于某些URI因包含某种指示着网络可达性的协议而作为地址存在的提醒而已。基于URI的众多标准，例如资源描述框架等，已经清楚地表明，资源标志本无需指出通过互联网获得资源副本的方法，亦无须指出资源是否基于网络。

在2006年11月1日，W3C技术架构小组（W3C's Technical Architecture Group，TAG）公布了《连接替代副本使查找和发布可行化》，一个对于发布给定资源的多个版本的权威URI和其最佳实践的指导。例如，内容可能因用于访问资源的设备的支持性和设定不同，而语言或大小上有所调整已适应这种差异。

语义网使用HTTP URI协议以标志文档和现实世界中的概念：这使得人们就如何区分二者产生了一些困扰。W3C技术架构小组在2005年6月发布了一封关于如何解决这一问题的电子邮件，该邮件被称为“http范围-14 决议”。

为了扩充这个（相当简短的）电子邮件，W3C在2008年3月发布了互联网组注释《用于语义网的酷URI》。这一文档详细阐释了内容协商和303重定向码的使用。

## URI引用

另一种类型的字符串——“URI引用”——代表一个URI并（相应地）代表被该URI所标志的资源。非正式使用中，URI和URI引用的区别少有被提及，但协议文档自然不应允许歧义的存在。

URI引用可取用的格式包括完整URI，URI中协议特定的部分，或其后附部分——甚至是空字符串。一个可选的片段标志符以#开头，可出现在URI引用的结尾。引用中，#之前的部分间接标志一个资源，而片段标志符则标志资源的某个部分。

为从URI引用获得URI，软件将URI引用与一个绝对“基址”基于一个固定算法合并，并转换为“绝对”形式。系统将URI引用视作相对于基址URI，虽然在绝对引用的情况下基址并无意义。基址URI一般标志包含URI引用的文档，但仍可被文档内包含的声明，或外部数据传输协议所包括的声明改写。若基址URI包括一个片段标志符，则该标志符在合并过程中被忽略。如果在URI引用中出现片段标志符，则在合并过程中被保留。

网络文档标记语言时常使用URI引用指向其它资源，如外部文档或同一逻辑文档的其他部分等。

### 标记语言中URI引用的使用

- 在HTML中，`img`元素的`src`属性值是URI引用，`a`或`link`元素的`href`属性值亦如是。
- 在XML中，在一个DTD中的`SYSTEM`关键字之后出现的系统描述符是一个无片段的URI引用。
- 在XSLT中，`xsl:import`元素/指令的`href`属性值是一个URI引用，`document()`函数的第一个参数与之相仿。

### 绝对URI的例子

- http://example.org/absolute/URI/with/absolute/path/to/resource.txt
- ftp://example.org/resource.txt
- urn:issn`<XSLT>:1535-3613`

### URI引用的例子

- `http://zh.wikipedia.org/wiki/URI#Examples_of_URI_references` （"http" 指定协议名, "zh.wikipedia.org"是“典据”, "/wiki/URI"是指向英文维基页面的“路径”，而"#Examples_of_URI_references"是指向中文维基页面相应片段的“URI”。)
- http://example.org/absolute/URI/with/absolute/path/to/resource.txt
- //example.org/scheme-relative/URI/with/absolute/path/to/resource.txt

/relative/URI/with/absolute/path/to/resource.txt

- relative/path/to/resource.txt
- ../../../resource.txt
- ./resource.txt#frag01
- resource.txt
- #frag01
- (空字符串)

## URI解析

“解析”一个URI意味着将一个相对URI引用转换为绝对形式，或者通过尝试获取一个可解引URI或一个URI引用所代表的资源来解引用这个URI。文档处理软件的“解析”部分通常同时提供这两种功能。

一个URI引用可以是一个同文档引用：一个指向包含URI引用自身的文档的引用。文档处理软件可有效地使用其当前的文档资源来完成对于同文档引用的解析而不需要重新取得一份资源。这只是一个建议——文档处理软件自然可以选用另外的方法来决定是否获取新资源。

当前的URI规范，RFC 3986，将一个同文档引用的URI定义为“当解析为绝对形式时与引用的基文档地址完全一致的文档”。一般来说，基文档URI就是包含引用的文档的URI。例如，XSLT 1.0包括`document()`函数以实现这一功能。RFC 3986同时也正式定义了URI等效性，一个可以被用来判断一个与基URI不同的URI是否表示同一个资源，并因此可以被认为是同文档引用。

RFC 2396给出了一个不同的判断同文档引用的方法；RFC 3986替代了RFC 2396，但RFC 2396仍旧作为许多规范和实现的基础而存在。这一规范将一个空字符串或仅包括#字符和可选的片段标志符组成的URI引用定义为同文档引用。

## 与XML命名空间的关系

XML拥有一个叫命名空间的，一个可包含元素集和属性名称的抽象域的概念。命名空间的名称（一个必须遵守通用URI文法的字符串）用于标志一个XML命名空间。但是，命名空间的名称一般不被认为是一个URI，因为URI规范定义了字符串的“URI性”是根据其目的而不是其词法组成决定的。一个命名空间名称同时也并不一定暗示任何URI协议的语义；例如，一个以“http:”开头的命名空间名称很可能与HTTP协议没有任何关系。XML专家们就这一问题在XML开发电子邮件列表上进行了深入的辩论；一部分人认为命名空间名称可以是URI，由于包含一个具体命名空间的名称集可以被看作是一个被标志的资源，也由于“XML中的命名空间”规范的一个版本指出过命名空间名称“是”一个URI引用。但是，集体共识似乎指出一个命名空间名称只是一个凑巧看起来像URI的字符串，仅此而已。

早先，命名空间名称是可以匹配任何非空URI引用的语法的，但后来的一个对于“XML命名空间建议”的订正废弃了相对URI引用的使用。一个独立的、针对XML 1.1的命名空间的规范允许使用IRI引用作为命名空间名称的基准，而不仅是URI引用。

为了消除XML新人中产生的对于URI（尤其是HTTP URL）的使用的困惑，一个被称为RDDL（资源目录描述语言）的描述语言被建立了，虽然RDDL的规范并没有正式地位，也并没有获得任何相关组织（例如W3C）的检查和支持。一个RDDL文档可以提供关于一个特定命名空间和使用它的XML文档的，机器与人类都能读懂的信息。XML文档的作者鼓励使用RDDL文档，这样一旦文档中的命名空间名称被索引，（系统）就会取得一个RDDL文档。这样，许多开发者对于让命名空间名称指向网络可达资源的需求就能得到满足。