什么是 URI, URL 和 URN?

11 天前
 logto

在开发 Web 应用时,我们经常需要调用不同的服务。在配置不同服务的通信和连接时,我们经常遇到 URI 、URL 和 URN 的概念。通常,用户很难区分它们,导致混淆或错误的使用。在本文中,我们将通过实例解释它们之间的区别,帮助大家更好地理解这些概念,并在阅读技术博客、文档或与其他工程师交流时正确地解读和使用它们。

什么是 URL ?

URL (统一资源定位符)提供了互联网上资源的网络地址或位置。它通常用于指定网页、文件或服务的位置。URL 提供了一种标准化的格式来访问网络上的资源。它是网络浏览、链接和互联网通信的关键组成部分。

URL 由几个部分组成,这些部分一起定义了资源的地址和用于访问它的协议。让我们解析下面的 URL 作为例子,一一解释每个部分的功能。

https://example.logto.io:8080/blogs/index.html?param1=value1&param2=value2#introduction
  1. Scheme: 指定了用于访问资源的协议或方案,如 HTTP (超文本传输协议)、HTTPS (安全的 HTTP )、FTP (文件传输协议)或 其他

    此 URL 中的 scheme 是 https

  2. Host: 主机指定了托管资源的服务器的域名或 IP 地址。

    此 URL 中的 host 是 example.logto.io

  3. Port: (可选)端口表示在主机上访问资源的特定端口号。如果没有指定端口,它默认为给定方案的标准端口。

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

    此 URL 中的 port 是 8080

  4. Path: (可选)路径指示服务器上资源所在的特定位置或目录,可以包括目录和文件名。

    此 URL 中的 path 应为 /blogs/index.html

  5. Query parameters: (可选)查询参数是传递给资源的额外参数,通常用于动态网络应用。它们出现在路径之后,由 ? 符号分隔。

    此 URL 中的 query parameters 是 params1=value1&param2=value2,通常以键值对的形式表示,对之间由 & 符号分隔。在实际使用场景中,通常需要编码以避免空格等字符。

  6. Fragment identifier: (可选)它也可以被称为锚,用于定位资源中的特定位置。

    此 URL 中的锚是 #introduction

此外,使用文件服务或许多网页上的 "联系我们" 按钮都链接到 URL ,例如:

什么是 URI ?

URI 代表 "统一资源标识符"。它是一个字符串,用于标识特定的资源,如网页、文件或服务。URI 提供了一种使用标准化格式唯一标识和定位资源的方法。

URI 主要由两个组成部分组成:

  1. Scheme: 指示用于访问资源的协议或方案。
  2. Resource identifier: 标识正在访问或引用的特定资源。资源标识符的格式取决于使用的方案。

从语法角度看,URI 大多遵循 URL 的相同格式,如 RFC 3986 中所述。

尽管这种 URI 格式与 URL 的相似,但它并不能保证访问 Web 上的所有资源。使用这种格式可以减少命名空间名称冲突。

在上面的部分中,我们介绍了 URL ,它不仅标识资源,还帮助定位资源。所以,实际上,URL 是 URI 的一个适当的子集。

什么是 URN ?

URN 可能不如 URL 和 URI 常见。它代表 "统一资源名称",其范围是以持久的方式标识资源,即使这些资源不再存在。

与 URL 不同,URN 不提供任何关于如何定位资源的信息;它只是标识它,就像一个纯 URI 一样。具体来说,URN 是一种带有 "urn" 方案的 URI ,其结构如 RFC 2141 中所述:

<URN>:<NID>:<NSS>

  1. URN: 通常为 urn
  2. 命名空间标识符( NID ): 代表一个唯一的命名空间或标识符系统,定义和管理 URN 。它提供上下文,并确保标识符的唯一性。命名空间的例子包括 ISBN (国际标准书号)等。
  3. 命名空间特定字符串( NSS ): 它是一个字符串,唯一地在指定的命名空间内标识一个资源。标识符本身并不传达任何关于资源位置或访问方法的信息。

例如,一本非常著名的介绍计算机系统的书 CS: APP 的 ISBN 号表示为 URN urn:isbn:9780134092669

URN 经常用于各种标准协议中,如 SAML 协议中的断言,对应于 URN urn:oasis:names:tc:SAML:2.0:assertion

在软件工程中,我们也可以根据 URN 命名规则为我们自己的系统中的特定目的定义 URN 。例如,在 Logto 中,要启用 Organization ,你需要在使用 SDK 时在配置中添加 urn:logto:scope:organizations 这个 scope 。每个 Organization 也有自己的专用 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 。


如果有任何想法,欢迎大家讨论。更多文章请见我们的 博客

1185 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1050461

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX