下文是对维基百科中URI介绍的粗略翻译。原文
Uniform Resource Identifier统一资源标识符
在信息技术领域,URI(Uniform Resource Identifier)是由字符组成的用来标识资源的字符串。
这种标识可以让我们通过使用特定的协议与网络上的资源进行交互,典型的就是万维网(World Wide Web)上的资源。每个URI都有一个特定的格式来定义,这种格式指定了具体的语法和与之相关的协议。URI最常见的形式是URL(Uniform Resource Locator),成为统一资源定位符,经常非正式的称为网络地址。URI的另一种不常见的用途是URN(Uniform Resource Name),称为统一资源名称。URN被设计用来作为URL的补充,它提供了一种在特定的名称空间中标识资源的机制。
URI、URL和URN的关系
对于一个资源来说,URN就好比他的名字,而URL就好比是资源的街道住址。换句话说,URN标识了一个资源项目,而URL则提供了一种找到他的方法。
作为URI的一种,URL不仅标识的一个资源,还提供了如何与这个资源进行交互或者如何得到这个资源的方法,比如同时指定基本的获取机制和网络位置。举个例子,http://example.org/wiki/Main_Page,指向了一个被识别为/wike/Main_Page的资源,这个资源的表现形式是HTML和相关的代码。而获取这个资源的方法是在网络中从一个名为example.org的主机上,通过HTTP( Hypertext Transfer Protocol)获得。
而URN则是一种在特定的名称空间中通过通过名字来标识资源的URI。当讨论一种资源而不需要知道它的位置或者如何去获得它的时候,就可以使用URN。例如,在International Standard Book Number (ISBN)系统中,* ISBN 0-486-27557-4 用来指定莎士比亚的作品《罗密欧与朱丽叶》的一个特定版本。指示这一版本的URN是urn:isbn:0-486-27557-4*,如果想要获得这个版本的书,就需要知道它的位置,这样就必须知道它的URL。
概念区分
技术刊物,尤其是由IEF和W3C制定的标准,通常使用由2001版的W3C推荐标准所陈述的观点。这种观点承认URI的概念而不支持将URI正式划分为URL和URN.
URL是一种有用但并不正式的概念:URL是这样一种URI,它通过对一种资源的基本获得机制的陈述来标识这种资源,比如这种资源在网络中的“位置”,而不是通过这种资源含有的其他属性来标识资源。
URL是一种URI,而它刚好在网络中指向一个资源。
然而在非技术背景下以及在万维网的软件中,URL这个术语的应用相当广泛。并且,web address(它并没有正式的定义)这个术语经常出现在非技术的刊物中,它被当做使用http或者https格式的URI的同义词。这样的设想经常会引起混淆,比如XML的名称空间,它和可解析的URI非常相似。
尽管大多数URI格式被设计的时候是带有特定的协议的,并且通常带有相同的名字,但是在语法上它们和协议仍是不同的。比如,http格式的URI用来通过HTTP协议和网络资源进行交互,然而file格式的URI却并没有特定的协议。
语法
在1998年8月出版的 Request for Comments (RFC) 2396中,第一次定义了通用的URI和绝对URI引用的语法。其最终成型是在2005年1月出版的RFC 3986。
通常的URI格式如下:
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
它包括以下部分:
scheme,由字母开头后面跟着数字,
+
,.
或-
。尽管scheme对大小写不敏感,但权威的使用方式是使用小写字母,并且相关的文档也应该使用小写字母。他的后面会跟着:
。常见的格式包括http(s)
,ftp
,mailto
,file
,data
和irc
。URI格式应该在 Internet Assigned Numbers Authority (IANA)注册,尽管不注册的有的也正在实际中使用。双斜杠
//
: 有些格式中必须使用,而有的则不需要。当缺少认证部分(下面会有解释)时,URI的路径部分不能以//
开头。-
认证部分authority part,, 包括
- 由用户名和密码组成的认证部分,用户名和密码之间使用
:
分割,并且密码后面跟着@
符号 -
host,由一个已经注册的名字(包括但不限于hostname)或者一个IP地址组成。IPV4地址应该是由
.
连接的十进制格式,IPV6地址应该用方括号[]
包起来。 - 可选的端口号,使用
:
和主机名分隔开。
- 由用户名和密码组成的认证部分,用户名和密码之间使用
路径path,路径中包含着数据。数据以分层的形式组织起来,通常表现为通过
/
连接。这和文件系统的路径很相似,但是这种路径的层级关系并不和文件系统路径的层级关系一摸一样。如果有认证部分的话,路径需要以/
开头,如果没有认证部分,那么路径不能以//
开始。路径总是会被定义的,不过有时候可能是空,所以URI的结尾没有/
。-
一个可选的查询query部分,和之前的部分以
?
分割,包含有非层级关系的查询字符串,查询字符串的语法并没有准确的定义,一般是由一组组的键值对通过特定的界定符连接起来。查询界定符 例子 & key1=value1&key2=value2 ; key1=value1;key2=value2 一个可选的片段frament,通过
#
和前面的部分分开。片段包含一个片段标识符,用来提供二级资源的方向,比如被URI标识的一篇文章中的某个章节的标题。当基本资源是一个HTML文档时,片段通常是某个特定元素的id属性,并且浏览器会将该元素滚动到视野中。
URI中一个字节的字符串以字符的形式出现,URI中合法的字符是ASCII字符,这些字符可以表示现代英语字母表中的大写字母和小写字母,阿拉伯数字,连字符(hyphen),句号(period),下划线(underscore)和波浪号(tilde)。八位字节的其他字符必须使用百分数编码进行表示。
ASCII字符集中的其他符号字符,/ ? # [ ] @
,作为保留字符,在URI的组成部分之间当作分隔符使用,所以出现的这些字符必须使用百分数编码,比如%3F
用来表示问好?
。
按照一般的URI语法,! $ & ' ( ) * + , ; =
这些字符可以在用户信息(user information),主机(host)和路径(path)中,作为分隔符,被无编码的合法使用。
:
和@
可以无编码的出现在路径(path),查询字符串(query)和片段(fragment)中;?
和/
可以无编码的出现在查询字符串(query)和片段(fragment)中。
例子
下面是URI组成的两个例子:
hierarchical part
┌───────────────────┴─────────────────────┐
authority path
┌───────────────┴───────────────┐┌───┴────┐
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
└┬┘ └───────┬───────┘ └────┬────┘ └┬┘ └─────────┬─────────┘ └──┬──┘
scheme user information host port query fragment
urn:example:mammal:monotreme:echidna
└┬┘ └──────────────┬───────────────┘
scheme path
URI引用
URI引用的形式可以是完整的URI,可以是完整URI的格式指定部分,还可以是完整URI的后面的部分,或者是空字符串。以#
引导的可选的片段标识可能出现在URI引用的结尾部分。引用中#
前面的部分间接地标识了一个资源,片段标识部分标识了这个资源的一部分。
为了从URI引用中得到URI,软件通过使用特定的算法将URI引用和基准URI合并来将其转化为绝对形式。系统将URI引用当作基准URI的相对部分,虽然在绝对引用的情况下,基准URI并没有什么相关性。如果基准URI当中包含有片段标识,在合并过程中,它会被忽略。如果片段标识出现在URI引用中,那么在合并过程中它会被保留。
Web文档标记语言经常使用URI引用来指向其他资源,比如外部文档,或者逻辑上属于同一个文档的其他部分。
标记语言中的例子
- HTML文档中,
img
的src
属性的值,a
或link
元素的href
属性的值 - In XML, the system identifier appearing after the SYSTEM keyword in a DTD is a fragmentless URI reference.
XML文档中,在DTD中,出现在SYSTEM关键字后面的系统标识符,是没有片段的URI引用 - In XSLT, the value of the
href
attribute of thexsl:import
element/instruction is a URI reference; likewise the first argument to thedocument()
function.
绝对URI的例子
- https://example.org/absolute/URI/with/absolute/path/to/resource.txt
- https://example.org/absolute/URI/with/absolute/path/to/resource
- ftp://example.org/resource.txt
- urn:ISSN:1535-3613
URI引用的例子
- https://example.org/absolute/URI/with/absolute/path/to/resource.txt
- //example.org/scheme-relative/URI/with/absolute/path/to/resource.txt
- //example.org/scheme-relative/URI/with/absolute/path/to/resource
- /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实际上相同时,那么它被定义为同文档引用。当遇到同文档引用时,文档处理软件,比如web浏览器,将使用当前的文档来满足对指向当前文档的引用的解析,而不是获得新的文档。当一个URI引用,虽然对基准URI来说不完全相同,但是指向了同一个资源时,它被称为等价URI。