URI
统一资源标识符(英语:Uniform Resource Identifier,缩写:URI)是一个用于标识某一抽象或物理资源的紧凑字符序列[1][2]。URI由蒂姆·伯纳斯-李(Tim Berners-Lee)提出[3],是万维网核心基础技术之一[4]。URI的最常见形式是统一资源定位符(URL),即网络地址;另一种形式是统一资源名称(URN),仅通过名称标识资源而不涉及位置[1][5]。URI由互联网工程任务组(IETF)标准化,当前通用语法标准为RFC 3986(2005年),属于互联网标准STD 66[1][6]。
历史
URI与URL有着共同的历史渊源。1990年,蒂姆·伯纳斯-李在其关于超文本的提案中引入了使用短字符串作为超链接目标资源标识的概念,当时被称为“超文本名”或“文档名”[7][2]。随后三年间,随着万维网核心技术的快速发展,区分“资源定位”与“资源命名”两种字符串的需求逐渐显现[7]。
1994年6月,IETF发布了RFC 1630,由伯纳斯-李撰写,首次定义了“通用资源标识符”的概念,并指出了URL和URN的存在[2][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[1][6]。RFC 3986由伯纳斯-李、Roy Fielding和Larry Masinter共同撰写,定义了URI的通用语法、解析相对引用的流程以及安全考量[1][11]。
2002年8月,RFC 3305指出,尽管“URL”一词在日常用语中仍被广泛使用,但其作为技术术语已几乎被废弃,其功能仅是提醒某些URI包含指示网络可达性的协议地址[12][7]。
与URL和URN的关系
结构
RFC 3986定义了URI的通用语法结构[1]:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
其中各部分含义如下:
- 协议(Scheme):URI的第一部分,由字母开头后跟字母、数字、加号、点号或连字符组成,不区分大小写。协议名称定义了URI的语义和交互协议,常见的有`http`、`https`、`ftp`、`mailto`、`urn`、`file`等[1]。
- 层级部分(Hier-part):协议之后的内容,通常包含权威机构(Authority)和路径(Path)。权威机构格式为`[userinfo@]host[:port]`,其中userinfo可包含用户名和密码,host为主机名或IP地址,port为端口号[1]。
- 路径(Path):由斜杠分隔的字符串序列,表示资源在服务器上的位置[1]。
- 查询(Query):以问号`?`开头,用于向资源传递参数,通常格式为键值对`key=value`,多个参数间用`&`分隔[1]。
- 片段(Fragment):以井号`#`开头,指向资源内部的特定位置,如HTML文档中的某个锚点。片段信息仅在客户端处理,不会发送至服务器[1]。
示例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字符集的一个子集,包括未保留字符(字母、数字、`-`、`.`、`_`、`~`)和保留字符(`:`、`/`、`?`、`#`、`[`、`]`、`@`、`!`、`$`、`&`、`'`、`(`、`)`、`*`、`+`、`,`、`;`、`=`)[1][13]。
对于不在上述范围内的字符(如中文、空格等),需要进行百分号编码(Percent-encoding):将每个非允许字符的UTF-8编码字节转换为两位十六进制数,并在其前加上百分号`%`[1][13]。例如,空格(ASCII 32)编码为`%20`,中文“中国”在UTF-8下编码为`%E4%B8%AD%E5%9B%BD`[13]。
标准
URI的主要标准文件包括:
参考文献
- ↑ 1.00 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.10 1.11 1.12 1.13 1.14 1.15 1.16 引用错误:
<ref>标签无效;未给name(名称)为rfc3986的ref(参考)提供文本 - ↑ 2.0 2.1 2.2 2.3 引用错误:
<ref>标签无效;未给name(名称)为rfc1630的ref(参考)提供文本 - ↑ 引用错误:
<ref>标签无效;未给name(名称)为royal-society的ref(参考)提供文本 - ↑ 4.0 4.1 Uniform Resource Identifier - Wikipedia
- ↑ 5.0 5.1 5.2 5.3 第二十九期:浏览器导航---URI 和 URL
- ↑ 6.0 6.1 6.2 STD 66
- ↑ 7.0 7.1 7.2 7.3 7.4 7.5 科普中国-URI
- ↑ 8.0 8.1 8.2 RFC 1738: Uniform Resource Locators (URL)
- ↑ 9.0 9.1 9.2 9.3 RFC 2141: URN Syntax
- ↑ RFC 2732: Format for Literal IPv6 Addresses in URL's
- ↑ RFC 3986 - RFC Editor
- ↑ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest Group
- ↑ 13.0 13.1 13.2 网址编码 - Google Developers
- ↑ RFC 3987: Internationalized Resource Identifiers (IRIs)