揭開 URI、URL 和 URN 的面紗
本指南概述 URI、URL 和 URN,說明它們的差異及使用情況。
在開發網頁應用程式時,我們經常需要調用不同的網絡服務。在配置不同網絡服務之間的通信和連接時,我們經常會遇到 URI、URL 和 URN 的概念。通常,使用者發現它們難以區分,導致混淆或錯誤的使用。在本文中,我們將提供範例並解釋它們之間的差異,以幫助大家更好地理解這些概念,並在閱讀技術博客、文件或與其他工程師交流時正確解釋和使用。
什麼是 URL?
URL(統一資源定位器)提供互聯網資源的網絡地址或位置。它通常用於指定網頁、檔案或服務的位置。URL 提供了一種標準化的格式來訪問網絡上的資源。它是網頁瀏覽、連結和互聯網通信的關鍵組成部分。
一個 URL 由多個部分組成,這些部分共同定義了資源的地址和用於訪問它的協議。讓我們解析下面的 URL 作為範例,逐一解釋每個部分的功能。
-
Scheme: 這指定了用於訪問資源的協議或方案,例如 HTTP(超文本傳輸協議)、HTTPS(安全超文本傳輸協議)、FTP(文件傳輸協議)或其他。
URL 中的 scheme 是
https
。 -
Host: Host 指定了主機的域名或 IP 地址,該主機承載資源。
URL 中的 host 是
example.logto.io
。 -
Port:(可選)Port 表示在主機上訪問資源的特定端口號。如果未指定端口,則默認為給定方案的標準端口。
HTTP 的默認端口是 80,而 HTTPS 的默認端口是 443。
URL 中的 port 是
8080
。 -
Path:(可選)Path 指示伺服器上資源所在的具體位置或目錄,可以包含目錄和文件名。
URL 中的 path 應該是
/blogs/index.html
。 -
Query Parameters:(可選)查詢參數是傳遞給資源的附加參數,通常用於動態網頁應用程式。它們出現在路徑之後,以
?
符號分隔。URL 中的查詢參數是
params1=value1¶m2=value2
,通常以鍵值對的形式表示,對之間用&
符號分隔。在真實使用場合中,通常需要編碼以避免空格等字符。 -
Fragment Identifier:(可選)也可以稱為錨點,用於定位資源中的特定位置。
URL 中的錨點是
#introduction
。
此外,例如,使用檔案服務或許多網頁上的 "聯繫我們" 按鈕都鏈接到 URL,例如:
ftp://documents.logto.io/files/legal/soc_ii.pdf
mailto:[email protected]?subject=Enterprise%20quota%20request
什麼是 URI?
URI 代表 "統一資源識別符"。它是一串字符,識別特定資源,如網頁、文件或服務。URI 提供了一種使用標準化格式來唯一識別和定位資源的方法。
URI 主要由兩個組件構成:
- Scheme: 指示用於訪問資源的協議或方案。
- Resource Identifier: 識別正在訪問或引用的具體資源。資源識別符的格式取決於使用的方案。
從語法上看,URI 大多遵循與 URL 相同的格式,如 RFC 3986 中所述。
雖然 URI 格式類似於 URL 格式,但它並不保證可以訪問網絡上的任何資源。使用這種格式可以減少命名空間名稱衝突。
在上面的部分中,我們介紹了 URL,它不僅識別資源,還可以幫助定位該資源。因此,實際上,URL 是 URI 的正確子集。
什麼是 URN?
URN 可能不像 URL 和 URI 那樣常見。它代表 "統一資源名",其範疇是以持久的方式識別資源,即使這些資源不再存在。
與 URL 不同,URN 不提供定位資源的任何信息;它僅識別資源,類似於純粹的 URI。具體來說,URN 是一種類型的 URI,其方案是 "urn",其結構如下所述 RFC 2141:
<URN>:<NID>:<NSS>
- URN: 通常為
urn
。 - Namespace Identifier (NID): 代表一個唯一命名空間或識別系統,用於定義和管理 URN。它提供上下文並確保識別符的唯一性。命名空間的例子包括 ISBN(國際標準書號)等。
- Namespace Specific String (NSS): 它是一串字符,唯一定義指定命名空間內的資源。識別符本身不傳達任何關於資源的位置或訪問方法的信息。
例如,一本非常著名的書介紹計算機系統 CSAPP 的國際標準書號被表示為 URN urn:isbn:9780134092669
。
URNs 經常用於各種標準協議中,例如在 SAML 協議中的斷言,對應於 URN urn:oasis:names:tc:SAML:2.0:assertion
。
在軟體工程中,我們還可以根據 URN 命名規則為我們自己的系統定義特定目的的 URN 。例如,在 Logto 中,為了啟用組織功能,需要在使用 SDK 時在配置中添加 urn:logto:scope:organizations
範圍。每個組織還有其自己的專屬 URN urn:logto:organization:{orgId}
。
結論
URI、URL 和 URN 之間的關係可以用以下維恩圖來說明:
URI、URL 和 URN 都可以用來識別不同的資源,但只有 URL 可以精確定位資源的位置。
URI 和 URL 可以支持多種方案,如 HTTP、HTTPS、FTP,但 URN 可以被視為僅支持 urn
方案。
所有的 URLs 或 URNs 都是 URIs,但不是所有的 URIs 都是 URLs 或 URNs。