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的關係
URI是統一資源定位符(URL)和統一資源名稱(URN)的超集[1][5]。
- URL(統一資源定位符):是一種URI,不僅標識資源,還指明了如何定位和獲取該資源,通常包含協議(如`http`、`ftp`)和網絡位置(如域名或IP位址)[5][8]。所有URL都是URI,但反之不成立[1]。
- URN(統一資源名稱):是一種URI,僅通過特定命名空間中的唯一名稱來標識資源,不提供資源的網絡位置或訪問方法[9][5]。URN的典型語法為`urn:<NID>:<NSS>`,例如`urn:isbn:0451450523`標識一本具有該ISBN號的書籍[9]。
在實踐中,URL和URI兩個術語經常被混用,但技術上URL是URI的子集[1][4]。
結構
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的主要標準文件包括:
- RFC 1630(1994年):首次定義URI概念,已廢棄[2]。
- RFC 1738(1994年):URL正式標準,已部分廢棄[8]。
- RFC 2141(1997年):URN語法標準[9]。
- RFC 2396(1998年):URI文法獨立標準,已廢棄[7]。
- RFC 3986(2005年):URI通用語法現行標準,網際網路標準STD 66[1][6]。
- RFC 3987(2006年):國際化資源標識符(IRI)標準,允許在URI中使用非ASCII字符[14]。
參考文獻
- ↑ 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>標籤,未定義名稱為rfc3986的參考文獻內容文字。 - ↑ 2.0 2.1 2.2 2.3 引用錯誤:無效的
<ref>標籤,未定義名稱為rfc1630的參考文獻內容文字。 - ↑ 引用錯誤:無效的
<ref>標籤,未定義名稱為royal-society的參考文獻內容文字。 - ↑ 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)