揭示 URI、URL 和 URN
本指南提供 URI、URL 與 URN 的概覽,解釋它們的區別和使用場景。
在開發網頁應用程式時,我們經常需要調用不同的網頁服務。在配置不同的網頁服務的通信和連接時,我們常常會遇到 URI、URL 和 URN 的概念。通常,使用者很難區分它們,導致混淆或不正確的使用。在本文中,我們將提供範例並解釋它們之間的區別,幫助大家更好地理解這些概念,並在閱讀技術博客、文件或與其他工程師交流時,正確解讀和使用它們。
什麼是 URL?
URL(統一資源定位符)提供了網絡上的資源地址或位置。它通常被用於指定網頁、文件或服務的位置。URL 提供了一種標準化的格式來訪問網絡上的資源。它是網頁瀏覽、鏈接和互聯網交流的重要組成部分。
URL 由幾個部分組成,這些部分共同定義了資源的地址和訪問它所使用的協議。讓我們解析下面的 URL 作為例子,並逐一解釋每個部分的功能。
-
Scheme(協議): 這指定了用於訪問資源的協議或方案,例如 HTTP(超文本傳輸協議)、HTTPS(HTTP 安全)、FTP(文件傳輸協議)或其他。
URL 中的協議是
https
。 -
Host(主機): 主機指定了承載資源的服務器的域名或 IP 地址。
URL 中的主機是
example.logto.io
。 -
Port(端口):(可選)端口表示在主機上訪問資源的具體端口號。如果未指定端口,則默認為給定協議的標準端口。
HTTP 的默認端口是 80,而 HTTPS 的默認端口是 443。
URL 中的端口是
8080
。 -
Path(路徑):(可選)路徑指示服務器上資源的具體位置或目錄,其中可以包括目錄和文件名。
URL 中的路徑應該是
/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 是一種使用“urn”方案的 URI,其結構如下所述,參見 RFC 2141:
<URN>:<NID>:<NSS>
- URN: 通常是
urn
。 - Namespace Identifier (NID): 代表唯一的命名空間或標識符系統,用於定義和管理 URN。它提供上下文並確保標識符的唯一性。命名空間的例子包括 ISBN(國際標準書號)等。
- Namespace Specific String (NSS): 它是一個字符串,用於在指定的命名空間內唯一標識資源。標識符本身不傳達任何有關資源位置或訪問方法的信息。
例如,一本非常著名的計算機系統介紹書 CSAPP 的 ISBN 號被表示為 URN urn:isbn:9780134092669
。
URNs 常用於各種標準協議中,例如 SAML 協議中的 assertion,對應於 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
協議。
所有 URL 或 URN 都是 URI,但不是所有 URI 都是 URL 或 URN。