下文是对维基百科中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。

概念区分

技术刊物,尤其是由IEFW3C制定的标准,通常使用由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,datairc。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文档中,imgsrc属性的值,alink元素的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 the xsl:import element/instruction is a URI reference; likewise the first argument to the document() 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。