繁體中文(香港)
  • uri
  • url
  • urn

揭示 URI、URL 和 URN

本指南提供 URI、URL 與 URN 的概覽,解釋它們的區別和使用場景。

Darcy Ye
Darcy Ye
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

在開發網頁應用程式時,我們經常需要調用不同的網頁服務。在配置不同的網頁服務的通信和連接時,我們常常會遇到 URI、URL 和 URN 的概念。通常,使用者很難區分它們,導致混淆或不正確的使用。在本文中,我們將提供範例並解釋它們之間的區別,幫助大家更好地理解這些概念,並在閱讀技術博客、文件或與其他工程師交流時,正確解讀和使用它們。

什麼是 URL?

URL(統一資源定位符)提供了網絡上的資源地址或位置。它通常被用於指定網頁、文件或服務的位置。URL 提供了一種標準化的格式來訪問網絡上的資源。它是網頁瀏覽、鏈接和互聯網交流的重要組成部分。

URL 由幾個部分組成,這些部分共同定義了資源的地址和訪問它所使用的協議。讓我們解析下面的 URL 作為例子,並逐一解釋每個部分的功能。

  1. Scheme(協議): 這指定了用於訪問資源的協議或方案,例如 HTTP(超文本傳輸協議)、HTTPS(HTTP 安全)、FTP(文件傳輸協議)或其他

    URL 中的協議是 https

  2. Host(主機): 主機指定了承載資源的服務器的域名或 IP 地址。

    URL 中的主機是 example.logto.io

  3. Port(端口):(可選)端口表示在主機上訪問資源的具體端口號。如果未指定端口,則默認為給定協議的標準端口。

    HTTP 的默認端口是 80,而 HTTPS 的默認端口是 443。

    URL 中的端口是 8080

  4. Path(路徑):(可選)路徑指示服務器上資源的具體位置或目錄,其中可以包括目錄和文件名。

    URL 中的路徑應該是 /blogs/index.html

  5. Query Parameters(查詢參數):(可選)查詢參數是傳遞給資源的附加參數,通常用於動態網頁應用程式。它們出現在路徑之後,並以 ? 符號分隔。

    URL 中的查詢參數是 params1=value1&param2=value2,通常以鍵值對的形式表示,鍵和值之間用 & 分隔。在實際使用場景中,通常需要進行編碼以避免空格等字符。

  6. 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 主要由兩個組件組成:

  1. Scheme(協議): 指示用於訪問資源的協議或方案。
  2. 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>

  1. URN: 通常是 urn
  2. Namespace Identifier (NID): 代表唯一的命名空間或標識符系統,用於定義和管理 URN。它提供上下文並確保標識符的唯一性。命名空間的例子包括 ISBN(國際標準書號)等。
  3. 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。