URI

**統一資源標識符**（英語：**U**niform **R**esource **I**dentifier，縮寫：**URI**）在電腦術語中是用於標識某一網際網路資源名稱的字串。

該種標識允許使用者對網路中（一般指全球資訊網）的資源通過特定的協定進行互動操作。URI 的最常見的形式是統一資源定位符（URL），經常指定為非正式的網址。更罕見的用法是統一資源名稱（URN），其目的是通過提供一種途徑。用於在特定的命名空間資源的標識，以補充網址。

## 與 URL 和 URN 的關係

URI 可被視為定位符（URL），名稱（URN）或兩者兼備。統一資源名（URN）如同一個人的名稱，而統一資源定位符（URL）代表一個人的住址。換言之，URN 定義某事物的身分，而 URL 提供尋找該事物的方法。

用於標識唯一書目的 ISBN 系統是一個典型的 URN 使用範例。例如，`ISBN 0-486-27557-4` 無二義性地標識出莎士比亞的戲劇《羅密歐與朱麗葉》的某一特定版本。為獲得該資源並閱讀該書，人們需要它的位置，也就是一個 URL 位址。在類 Unix 作業系統中，一個典型的 URL 位址可能是一個檔案目錄，例如 `file:///home/username/RomeoAndJuliet.pdf`。該 URL 標識出儲存於本地硬碟中的電子書檔案。因此，URL 和 URN 有著互補的作用。

### 技術觀點

URL 是一種 URI，它標識一個網際網路資源，並指定對其進行操作或取得該資源的方法。可能通過對主要存取手段的描述，也可能通過網路「位置」進行標識。例如，http://www.wikipedia.org/ 這個 URL，標識一個特定資源（首頁）並表示該資源的某種形式（例如以編碼字元表示的，首頁的 HTML 代碼）是可以通過 HTTP 協定從 www.wikipedia.org 這個網路主機獲得的。URN 是基於某命名空間通過名稱指定資源的 URI。人們可以通過 URN 來指出某個資源，而無需指出其位置和獲得方式。資源無需是基於網際網路的。例如，URN urn:ISBN 0-395-36341-1 指定標識系統（即國際標準書號 ISBN）和某資源在該系統中的唯一表示的 URI。它可以允許人們在不指出其位置和獲得方式的情況下談論這本書。

技術刊物，特別是 IETF 和 W3C 發布的標準中，通常不再使用「URL」這一術語，因為很少需要區別 URL 和 URI。但是，在非技術文獻和全球資訊網軟體中，URL 這一術語仍被廣泛使用。此外，術語「網址」（沒有正式定義）在非技術文獻中時常作為 URL 或 URI 的同義詞出現，雖然往往其指代的只是「http」和「https」協定。

### RFC 3305

關於 URI 的討論多源於題目為《W3C/IETF URI 規劃聯合小組報告：統一標識資源符（URI），URL 和統一資源名（URN）：闡明與建議》的 RFC3305 檔案。這一 RFC 檔案描述了一個，以統一 W3C 和 IETF 內部對於各種「UR\*」術語之間關係的不同看法為目的而設立的，W3C/IETF 聯合工作小組的工作。雖然未作為標準被這兩個組織所發布，但該檔案確立了上述種種共識，並就此催生了許多標準的誕生。

## 文法

URI 文法由 URI 協定名（例如 `http`、`ftp`、`mailto`、`file`），一個冒號，和協定對應的內容所構成。特定的協定定義了協定內容的語法和語意，而所有的協定都必須遵循一定的 URI 文法通用規則，亦即為某些專門目的保留部分特殊字元。URI 文法同時也就各種原因對協定內容加以其他的限制，例如，保證各種分層協定之間的協同性。百分號編碼也為 URI 提供附加資訊。

通用 URI 的格式如下：

> [協定名]://[使用者名稱]:[密碼]@[主機名]:[埠]/[路徑]?[查詢參數]#[片段 ID]
> 
> 

### 例子

下圖展示了兩個 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 與 URL 有著共同的歷史。在 1990 年，提姆・柏內茲 - 李的關於超文字的提案間接地引入了使用 URL 作為一個表示超連結目標資源的短字串的概念。當時，人們稱之為「超文字名」或「文件名」。

在之後的三年半中，由於全球資訊網的超文件標示語言核心技術、HTTP 與瀏覽器都得到了發展，區別提供資源存取和資源標記的兩種字串的必要性開始顯現。雖然其時尚未被正式定義，但「統一資源定位符」這一術語開始被用於代表前者，而後者則由「統一資源名稱」所表示。

在關於定義 URL 和 URN 的爭論中，人們注意到兩者事實上基於同一個基礎的「資源標識」的概念。在 1994 年 6 月，IETF 發布了 Berners-Lee 的 RFC 1630，（非正式地）指出了 URL 和 URN 的存在，並進一步定義了「通用資源標識符」—— 語意和語法由具體協定規定的類 URL 字串的規範文法。此外，該 RFC 文件亦嘗試定義了其時正被使用著的 URL 協定的文法，同時指出（但並未標準化）了相對 URL 和片段標識符的存在。

### 標準改良

1994 年 12 月，RFC 1738 正式定義了絕對和相對 URL，改進了 URL 文法，定義了如何解析 URL 為絕對形式，並更加完善地列舉了其時正處於使用中的 URL 協定。而 URN 定義和文法直到 1997 年 5 月 RFC 2141 公布後才正式統一。

1998 年 8 月，隨著 RFC 2396 的發表，URI 文法形成了獨立的標準，同時 RFC 1630 和 1738 中關於 URI 和 URL 的許多部分也得到了修訂和增補。。新 RFC 修改了「URI」中「U」的含義：它開始代表統一（Uniform）而不再是通用（Universal）。RFC 1738 中總結了既存 URL 協定的部分被移至另外一篇獨立文件中。IANA 保留著這些協定的註冊資訊，而 RFC 2717 首次描述了註冊它們的流程。

在 1999 年 12 月，RFC 2732 對 RFC 2396 進行了小幅更新，開始允許 URI 包括 IPv6 位址。一段時間以後，在兩個標準中暴露出的一些問題促使了一系列的修訂草案的發展，這些草案被統稱為 rfc2396bis。這一由 RFC 2396 的共同作者 Roy Fielding 引導協調的集體努力，由 2005 年 1 月 RFC 3986 的發布推至了頂峰。該 RFC 文件成為了現今（2009 年）於網際網路上被推薦使用的 URI 文法版本，並使得 RFC 2396 成為了歷史。然而，它卻並未替代現有的 URL 協定細節；RFC 1738 繼續管轄著大多數協定，除了某些已被它取而代之的場合 —— 例如被 RFC 2616 改良的「HTTP」協定等。與此同時，IETF 發布了 RFC 3986，亦即完整的 STD 66 標準，標識著 URI 通用文法正式成官方網際網路協定。

在 2002 年 8 月，RFC 3305 指出，雖然術語「URL」仍被廣泛地用於日常用語之中，但其本身已幾乎被廢棄。其現在的功用，僅是作為對於某些 URI 因包含某種指示著網路可達性的協定而作為位址存在的提醒而已。基於 URI 的眾多標準，例如資源描述框架等，已經清楚地表明，資源標識本無需指出通過網際網路獲得資源副本的方法，亦無須指出資源是否基於網路。

在 2006 年 11 月 1 日，W3C 技術架構小組（W3C's Technical Architecture Group，TAG）公布了《連接替代副本使尋找和發布可行化 （頁面存檔備份，存於網際網路檔案館）》，一個對於發布給定資源的多個版本的權威 URI 和其最佳實踐的指導。例如，內容可能因用於存取資源的裝置的支援性和設定不同，而語言或大小上有所調整已適應這種差異。

語意網使用 HTTP URI 協定以標識文件和現實世界中的概念：這使得人們就如何區分二者產生了一些困擾。W3C 技術架構小組在 2005 年 6 月發布了一封關於如何解決這一問題的電子郵件，該郵件被稱為「http 範圍 - 14 決議」 。

為了擴充這個（相當簡短的）電子郵件，W3C 在 2008 年 3 月發布了網際網路組注釋《用於語意網的酷 URI》。這一文件詳細闡釋了內容協商和 303 重新導向碼的使用。

## URI 參照

另一種類型的字串 ——「URI 參照」—— 代表一個 URI 並（相應地）代表被該 URI 所標識的資源。非正式使用中，URI 和 URI 參照的區別少有被提及，但協定文件自然不應允許歧義的存在。

URI 參照可取用的格式包括完整 URI，URI 中協定特定的部分，或其後附部分 —— 甚至是空字串。一個可選的片段標識符以 #開頭，可出現在 URI 參照的結尾。參照中，# 之前的部分間接標識一個資源，而片段標識符則標識資源的某個部分。

為從 URI 參照獲得 URI，軟體將 URI 參照與一個絕對「基址」基於一個固定演算法合併，並轉換為「絕對」形式。系統將 URI 參照視作相對於基址 URI，雖然在絕對參照的情況下基址並無意義。基址 URI 一般標識包含 URI 參照的文件，但仍可被文件內包含的聲明，或外部資料傳輸協定所包括的聲明覆寫。若基址 URI 包括一個片段標識符，則該標識符在合併過程中被忽略。如果在 URI 參照中出現片段標識符，則在合併過程中被保留。

網路文件標記式語言時常使用 URI 參照指向其它資源，如外部文件或同一邏輯文件的其他部分等。

### 標記式語言中 URI 參照的使用

* 在 HTML 中，`img` 元素的 `src` 屬性值是 URI 參照，`a` 或 `link` 元素的 `href` 屬性值亦如是。
* 在 XML 中，在一個 DTD 中的 `SYSTEM` 關鍵字之後出現的系統描述符是一個無片段的 URI 參照。
* 在 XSLT 中，`xsl:import` 元素 / 指令的 `href` 屬性值是一個 URI 參照，`document()` 函式的第一個參數與之相仿。

### 絕對 URI 的例子

* http://example.org/absolute/URI/with/absolute/path/to/resource.txt
* ftp://example.org/resource.txt
* urn:issn<XSLT>:1535-3613

### URI 參照的例子

* http://zh.wikipedia.org/wiki/URI#Examples\_of\_URI\_references （"http"指定協定名，"zh.wikipedia.org"是「典據」,"/wiki/URI"是指向英文維基頁面的「路徑」，而"#Examples\_of\_URI\_references" 是指向中文維基頁面相應片段的「URI」。)
* http://example.org/absolute/URI/with/absolute/path/to/resource.txt
* //example.org/scheme-relative/URI/with/absolute/path/to/resource.txt
* 

/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 參照可以是一個同文件參照：一個指向包含 URI 參照自身的文件的參照。文件處理軟體可有效地使用其當前的文件資源來完成對於同文件參照的解析而不需要重新取得一份資源。這只是一個建議 —— 文件處理軟體自然可以選用另外的方法來決定是否取得新資源。

當前截至 2009 年 (2009 -Missing required parameter 1=_month_!) 的 URI 規範，RFC 3986，將一個同文件參照的 URI 定義為「當解析為絕對形式時與參照的基文件位址完全一致的文件」。一般來說，基文件 URI 就是包含參照的文件的 URI。例如，XSLT 1.0 包括 `document()` 函式以實現這一功能。RFC 3986 同時也正式定義了 URI 等效性，一個可以被用來判斷一個與基 URI 不同的 URI 是否表示同一個資源，並因此可以被認為是同文件參照。

RFC 2396 給出了一個不同的判斷同文件參照的方法；RFC 3986 替代了 RFC 2396，但 RFC 2396 仍舊作為許多規範和實現的基礎而存在。這一規範將一個空字串或僅包括 #字元和可選的片段標識符組成的 URI 參照定義為同文件參照。

## 與 XML 命名空間的關係

XML 擁有一個叫命名空間的，一個可包含元素集和屬性名稱的抽象域的概念。命名空間的名稱（一個必須遵守通用 URI 文法的字串）用於標識一個 XML 命名空間。但是，命名空間的名稱一般不被認為是一個 URI，因為 URI 規範定義了字串的「URI 性」是根據其目的而不是其詞法組成決定的。一個命名空間名稱同時也並不一定暗示任何 URI 協定的語意；例如，一個以「http:」開頭的命名空間名稱很可能與 HTTP 協定沒有任何關係。XML 專家們就這一問題在 XML 開發電子郵寄清單上進行了深入的辯論；一部分人認為命名空間名稱可以是 URI，由於包含一個具體命名空間的名稱集可以被看作是一個被標識的資源，也由於「XML 中的命名空間」規範的一個版本指出過命名空間名稱「是」一個 URI 參照。但是，集體共識似乎指出一個命名空間名稱只是一個湊巧看起來像 URI 的字串，僅此而已。

早先，命名空間名稱是可以匹配任何非空 URI 參照的語法的，但後來的一個對於「XML 命名空間建議」的訂正廢棄了相對 URI 參照的使用。一個獨立的、針對 XML 1.1 的命名空間的規範允許使用 IRI 參照作為命名空間名稱的基準，而不僅是 URI 參照。

為了消除 XML 新人中產生的對於 URI（尤其是 HTTP URL）的使用的困惑，一個被稱為 RDDL（資源目錄描述語言）的描述語言被建立了，雖然 RDDL 的規範並沒有正式地位，也並沒有獲得任何相關組織（例如 W3C）的檢查和支援。一個 RDDL 文件可以提供關於一個特定命名空間和使用它的 XML 文件的，機器與人類都能讀懂的資訊。XML 文件的作者鼓勵使用 RDDL 文件，這樣一旦文件中的命名空間名稱被索引，（系統）就會取得一個 RDDL 文件。這樣，許多開發者對於讓命名空間名稱指向網路可達資源的需求就能得到滿足。

## 參見

* 統一資源定位符（URL）
* 統一資源名稱（URN）
* 鍵連資料（Linked data）
* XRI
* UUID

## 參考文獻