统一资源标识符(英语:Uniform Resource Identifier,缩写:URI)是一个用于标识某一抽象或物理资源的紧凑字符序列[2][1]。URI由蒂姆·伯纳斯-李(Tim Berners-Lee)提出[3],是万维网核心基础技术之一[4]。URI的最常见形式是统一资源定位符(URL),即网络地址;另一种形式是统一资源名称(URN),仅通过名称标识资源而不涉及位置[2][5]。URI由互联网工程任务组(IETF)标准化,当前通用语法标准为RFC 3986(2005年),属于互联网标准STD 66[2][6]。

统一资源标识符
中文名统一资源标识符
英文名Uniform Resource Identifier
缩写URI
提出者蒂姆·伯纳斯-李(Tim Berners-Lee)
首次定义1994年(RFC 1630)[1]
最新标准RFC 3986(2005年,STD 66)[2]
子类型URL、URN

历史

编辑

URI与URL有着共同的历史渊源。1990年,蒂姆·伯纳斯-李在其关于超文本的提案中引入了使用短字符串作为超链接目标资源标识的概念,当时被称为“超文本名”或“文档名”[7][1]。随后三年间,随着万维网核心技术的快速发展,区分“资源定位”与“资源命名”两种字符串的需求逐渐显现[7]。

1994年6月,IETF发布了RFC 1630,由伯纳斯-李撰写,首次定义了“通用资源标识符”的概念,并指出了URL和URN的存在[1][7]。同年12月,RFC 1738正式定义了URL的语法[8]。1997年5月,RFC 2141正式统一了URN的定义[9]。

1998年8月,RFC 2396的发布使URI文法形成了独立标准,同时修订和增补了此前RFC中关于URI和URL的诸多内容,并将“URI”中“U”的含义从“通用”(Universal)改为“统一”(Uniform)[7]。1999年12月,RFC 2732对RFC 2396进行了小幅更新,允许URI包含IPv6地址[10]。

2005年1月,RFC 3986发布,取代RFC 2396成为URI的现行通用语法标准,并被列为互联网标准STD 66[2][6]。RFC 3986由伯纳斯-李、Roy Fielding和Larry Masinter共同撰写,定义了URI的通用语法、解析相对引用的流程以及安全考量[2][11]。

2002年8月,RFC 3305指出,尽管“URL”一词在日常用语中仍被广泛使用,但其作为技术术语已几乎被废弃,其功能仅是提醒某些URI包含指示网络可达性的协议地址[12][7]。

与URL和URN的关系

编辑

URI是统一资源定位符(URL)和统一资源名称(URN)的超集[2][5]。

  • URL(统一资源定位符):是一种URI,不仅标识资源,还指明了如何定位和获取该资源,通常包含协议(如`http`、`ftp`)和网络位置(如域名或IP地址)[5][8]。所有URL都是URI,但反之不成立[2]。
  • URN(统一资源名称):是一种URI,仅通过特定命名空间中的唯一名称来标识资源,不提供资源的网络位置或访问方法[9][5]。URN的典型语法为`urn:<NID>:<NSS>`,例如`urn:isbn:0451450523`标识一本具有该ISBN号的书籍[9]。

在实践中,URL和URI两个术语经常被混用,但技术上URL是URI的子集[2][13]。

结构

编辑

RFC 3986定义了URI的通用语法结构[2]:

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

其中各部分含义如下:

  • 协议(Scheme):URI的第一部分,由字母开头后跟字母、数字、加号、点号或连字符组成,不区分大小写。协议名称定义了URI的语义和交互协议,常见的有`http`、`https`、`ftp`、`mailto`、`urn`、`file`等[2]。
  • 层级部分(Hier-part):协议之后的内容,通常包含权威机构(Authority)和路径(Path)。权威机构格式为`[userinfo@]host[:port]`,其中userinfo可包含用户名和密码,host为主机名或IP地址,port为端口号[2]。
  • 路径(Path):由斜杠分隔的字符串序列,表示资源在服务器上的位置[2]。
  • 查询(Query):以问号`?`开头,用于向资源传递参数,通常格式为键值对`key=value`,多个参数间用`&`分隔[2]。
  • 片段(Fragment):以井号`#`开头,指向资源内部的特定位置,如HTML文档中的某个锚点。片段信息仅在客户端处理,不会发送至服务器[2]。

示例URI:`https://www.example.com:443/docs/page.html?lang=zh#section2`

该例中,协议为`https`,权威机构为`www.example.com:443`,路径为`/docs/page.html`,查询为`lang=zh`,片段为`section2`。

编码

编辑

URI中允许使用的字符仅限于ASCII字符集的一个子集,包括未保留字符(字母、数字、`-`、`.`、`_`、`~`)和保留字符(`:`、`/`、`?`、`#`、`[`、`]`、`@`、`!`、`$`、`&`、`'`、`(`、`)`、`*`、`+`、`,`、`;`、`=`)[2][14]。

对于不在上述范围内的字符(如中文、空格等),需要进行百分号编码(Percent-encoding):将每个非允许字符的UTF-8编码字节转换为两位十六进制数,并在其前加上百分号`%`[2][15]。例如,空格(ASCII 32)编码为`%20`,中文“中国”在UTF-8下编码为`%E4%B8%AD%E5%9B%BD`[16]。

标准

编辑

URI的主要标准文件包括:

  • RFC 1630(1994年):首次定义URI概念,已废弃[1]。
  • RFC 1738(1994年):URL正式标准,已部分废弃[8]。
  • RFC 2141(1997年):URN语法标准[9]。
  • RFC 2396(1998年):URI文法独立标准,已废弃[7]。
  • RFC 3986(2005年):URI通用语法现行标准,互联网标准STD 66[2][6]。
  • RFC 3987(2006年):国际化资源标识符(IRI)标准,允许在URI中使用非ASCII字符[17]。

参考文献

编辑
  1. ↑ 1.0 1.1 1.2 1.3 1.4 RFC 1630: Universal Resource Identifiers in WWW
  2. ↑ 2.00 2.01 2.02 2.03 2.04 2.05 2.06 2.07 2.08 2.09 2.10 2.11 2.12 2.13 2.14 2.15 2.16 2.17 RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
  3. ↑ 引用错误:<ref>标签无效;未给name(名称)为royal-society的ref(参考)提供文本
  4. ↑ Uniform Resource Identifier - Wikipedia
  5. ↑ 5.0 5.1 5.2 5.3 第二十九期:浏览器导航---URI 和 URL
  6. ↑ 6.0 6.1 6.2 STD 66
  7. ↑ 7.0 7.1 7.2 7.3 7.4 7.5 科普中国-URI
  8. ↑ 8.0 8.1 8.2 RFC 1738: Uniform Resource Locators (URL)
  9. ↑ 9.0 9.1 9.2 9.3 RFC 2141: URN Syntax
  10. ↑ RFC 2732: Format for Literal IPv6 Addresses in URL's
  11. ↑ RFC 3986 - RFC Editor
  12. ↑ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest Group
  13. ↑ 引用错误:<ref>标签无效;未给name(名称)为wiki-uri的ref(参考)提供文本
  14. ↑ 网址编码 - Google Developers
  15. ↑ 引用错误:<ref>标签无效;未给name(名称)为google-encoding的ref(参考)提供文本
  16. ↑ 引用错误:<ref>标签无效;未给name(名称)为google-encoding的ref(参考)提供文本
  17. ↑ RFC 3987: Internationalized Resource Identifiers (IRIs)