|
|
| 第1行: |
第1行: |
| {{Infobox|标题=统一资源标识符|内容={{!}}-
| | <div style="width: 100%; border: 1px solid #a2a9b1; margin-bottom: 16px;"> |
| ! 中文名
| | <div style="background: #eaecf0; padding: 8px 12px; font-weight: bold;">{{{1|板块}}}</div> |
| {{!}} 统一资源标识符
| | <div style="padding: 12px;"> |
| {{!}}-
| | {{{2|}}} |
| ! 英文名
| | </div> |
| {{!}} Uniform Resource Identifier
| | <div style="text-align: right; padding: 6px 12px 10px; font-size: 0.9em;">{{{3|}}}</div> |
| {{!}}-
| | </div> |
| ! 缩写
| |
| {{!}} URI
| |
| {{!}}-
| |
| ! 提出者
| |
| {{!}} 蒂姆·伯纳斯-李(Tim Berners-Lee)
| |
| {{!}}-
| |
| ! 首次定义
| |
| {{!}} 1994年(RFC 1630)<ref name="rfc1630">[https://datatracker.ietf.org/doc/html/rfc1630 RFC 1630: Universal Resource Identifiers in WWW]</ref>
| |
| {{!}}-
| |
| ! 最新标准
| |
| {{!}} RFC 3986(2005年,STD 66)<ref name="rfc3986">[https://datatracker.ietf.org/doc/html/rfc3986 RFC 3986: Uniform Resource Identifier (URI): Generic Syntax]</ref>
| |
| {{!}}- | |
| ! 子类型
| |
| {{!}} [[URL]]、[[URN]]}}'''统一资源标识符'''({{lang-en|Uniform Resource Identifier}},缩写:'''URI''')是一个用于标识某一抽象或物理资源的紧凑字符序列<ref name="rfc3986" /><ref name="rfc1630" />。URI由[[蒂姆·伯纳斯-李]](Tim Berners-Lee)提出<ref name="royal-society" />,是[[万维网]]核心基础技术之一<ref name="wiki-uri">[[wikipedia:Uniform_Resource_Identifier|Uniform Resource Identifier - Wikipedia]]</ref>。URI的最常见形式是[[统一资源定位符]](URL),即网络地址;另一种形式是[[统一资源名称]](URN),仅通过名称标识资源而不涉及位置<ref name="rfc3986" /><ref name="url-urn-diff">[https://cloud.tencent.com.cn/developer/article/2049142 第二十九期:浏览器导航---URI 和 URL]</ref>。URI由[[互联网工程任务组]](IETF)标准化,当前通用语法标准为RFC 3986(2005年),属于互联网标准STD 66<ref name="rfc3986" /><ref name="std66">[https://www.rfc-editor.org/info/std66 STD 66]</ref>。 | |
| | |
| == 历史 ==
| |
| URI与URL有着共同的历史渊源。1990年,蒂姆·伯纳斯-李在其关于超文本的提案中引入了使用短字符串作为超链接目标资源标识的概念,当时被称为“超文本名”或“文档名”<ref name="kepu">[https://www.kepuchina.cn/article/articleinfo?business_type=100&classify=0&ar_id=352641 科普中国-URI]</ref><ref name="rfc1630" />。随后三年间,随着万维网核心技术的快速发展,区分“资源定位”与“资源命名”两种字符串的需求逐渐显现<ref name="kepu" />。
| |
| | |
| 1994年6月,IETF发布了RFC 1630,由伯纳斯-李撰写,首次定义了“通用资源标识符”的概念,并指出了URL和URN的存在<ref name="rfc1630" /><ref name="kepu" />。同年12月,RFC 1738正式定义了URL的语法<ref name="rfc1738">[[rfc:1738|RFC 1738: Uniform Resource Locators (URL)]]</ref>。1997年5月,RFC 2141正式统一了URN的定义<ref name="rfc2141">[[rfc:2141|RFC 2141: URN Syntax]]</ref>。
| |
| | |
| 1998年8月,RFC 2396的发布使URI文法形成了独立标准,同时修订和增补了此前RFC中关于URI和URL的诸多内容,并将“URI”中“U”的含义从“通用”(Universal)改为“统一”(Uniform)<ref name="kepu" />。1999年12月,RFC 2732对RFC 2396进行了小幅更新,允许URI包含IPv6地址<ref name="rfc2732">[[rfc:2732|RFC 2732: Format for Literal IPv6 Addresses in URL's]]</ref>。
| |
| | |
| 2005年1月,RFC 3986发布,取代RFC 2396成为URI的现行通用语法标准,并被列为互联网标准STD 66<ref name="rfc3986" /><ref name="std66" />。RFC 3986由伯纳斯-李、Roy Fielding和Larry Masinter共同撰写,定义了URI的通用语法、解析相对引用的流程以及安全考量<ref name="rfc3986" /><ref name="rfc3986-editor">[https://www.rfc-editor.org/info/rfc3986 RFC 3986 - RFC Editor]</ref>。
| |
| | |
| 2002年8月,RFC 3305指出,尽管“URL”一词在日常用语中仍被广泛使用,但其作为技术术语已几乎被废弃,其功能仅是提醒某些URI包含指示网络可达性的协议地址<ref name="rfc3305">[[rfc:3305|RFC 3305: Report from the Joint W3C/IETF URI Planning Interest Group]]</ref><ref name="kepu" />。
| |
| | |
| == 与URL和URN的关系 ==
| |
| URI是[[统一资源定位符]](URL)和[[统一资源名称]](URN)的超集<ref name="rfc3986" /><ref name="url-urn-diff" />。
| |
| | |
| * '''URL(统一资源定位符)''':是一种URI,不仅标识资源,还指明了如何定位和获取该资源,通常包含协议(如`http`、`ftp`)和网络位置(如域名或IP地址)<ref name="url-urn-diff" /><ref name="rfc1738" />。所有URL都是URI,但反之不成立<ref name="rfc3986" />。
| |
| * '''URN(统一资源名称)''':是一种URI,仅通过特定命名空间中的唯一名称来标识资源,不提供资源的网络位置或访问方法<ref name="rfc2141" /><ref name="url-urn-diff" />。URN的典型语法为`urn:<NID>:<NSS>`,例如`urn:isbn:0451450523`标识一本具有该ISBN号的书籍<ref name="rfc2141" />。
| |
| | |
| 在实践中,URL和URI两个术语经常被混用,但技术上URL是URI的子集<ref name="rfc3986" /><ref name="wiki-uri" />。
| |
| | |
| == 结构 ==
| |
| RFC 3986定义了URI的通用语法结构<ref name="rfc3986" />:<pre>URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]</pre>其中各部分含义如下:
| |
| | |
| * '''协议(Scheme)''':URI的第一部分,由字母开头后跟字母、数字、加号、点号或连字符组成,不区分大小写。协议名称定义了URI的语义和交互协议,常见的有`http`、`https`、`ftp`、`mailto`、`urn`、`file`等<ref name="rfc3986" />。
| |
| * '''层级部分(Hier-part)''':协议之后的内容,通常包含权威机构(Authority)和路径(Path)。权威机构格式为`[userinfo@]host[:port]`,其中userinfo可包含用户名和密码,host为主机名或IP地址,port为端口号<ref name="rfc3986" />。
| |
| * '''路径(Path)''':由斜杠分隔的字符串序列,表示资源在服务器上的位置<ref name="rfc3986" />。
| |
| * '''查询(Query)''':以问号`?`开头,用于向资源传递参数,通常格式为键值对`key=value`,多个参数间用`&`分隔<ref name="rfc3986" />。
| |
| * '''片段(Fragment)''':以井号`#`开头,指向资源内部的特定位置,如HTML文档中的某个锚点。片段信息仅在客户端处理,不会发送至服务器<ref name="rfc3986" />。
| |
| | |
| 示例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]]字符集的一个子集,包括未保留字符(字母、数字、`-`、`.`、`_`、`~`)和保留字符(`:`、`/`、`?`、`#`、`[`、`]`、`@`、`!`、`$`、`&`、`'`、`(`、`)`、`*`、`+`、`,`、`;`、`=`)<ref name="rfc3986" /><ref name="google-encoding">[https://developers.google.cn/search/docs/crawling-indexing/url-encoding 网址编码 - Google Developers]</ref>。
| |
| | |
| 对于不在上述范围内的字符(如中文、空格等),需要进行'''百分号编码'''(Percent-encoding):将每个非允许字符的[[UTF-8]]编码字节转换为两位十六进制数,并在其前加上百分号`%`<ref name="rfc3986" /><ref name="google-encoding" />。例如,空格(ASCII 32)编码为`%20`,中文“中国”在UTF-8下编码为`%E4%B8%AD%E5%9B%BD`<ref name="google-encoding" />。
| |
| | |
| == 标准 ==
| |
| URI的主要标准文件包括:
| |
| | |
| * '''RFC 1630'''(1994年):首次定义URI概念,已废弃<ref name="rfc1630" />。
| |
| * '''RFC 1738'''(1994年):URL正式标准,已部分废弃<ref name="rfc1738" />。
| |
| * '''RFC 2141'''(1997年):URN语法标准<ref name="rfc2141" />。
| |
| * '''RFC 2396'''(1998年):URI文法独立标准,已废弃<ref name="kepu" />。
| |
| * '''RFC 3986'''(2005年):URI通用语法现行标准,互联网标准STD 66<ref name="rfc3986" /><ref name="std66" />。
| |
| * '''RFC 3987'''(2006年):国际化资源标识符(IRI)标准,允许在URI中使用非ASCII字符<ref name="rfc3987">[[rfc:3987|RFC 3987: Internationalized Resource Identifiers (IRIs)]]</ref>。
| |
| | |
| == 参考文献 ==
| |
| <references /> | |