在开发 Web 应用时,我们经常需要调用不同的服务。在配置不同服务的通信和连接时,我们经常遇到 URI 、URL 和 URN 的概念。通常,用户很难区分它们,导致混淆或错误的使用。在本文中,我们将通过实例解释它们之间的区别,帮助大家更好地理解这些概念,并在阅读技术博客、文档或与其他工程师交流时正确地解读和使用它们。
URL (统一资源定位符)提供了互联网上资源的网络地址或位置。它通常用于指定网页、文件或服务的位置。URL 提供了一种标准化的格式来访问网络上的资源。它是网络浏览、链接和互联网通信的关键组成部分。
URL 由几个部分组成,这些部分一起定义了资源的地址和用于访问它的协议。让我们解析下面的 URL 作为例子,一一解释每个部分的功能。
https://example.logto.io:8080/blogs/index.html?param1=value1¶m2=value2#introduction
Scheme: 指定了用于访问资源的协议或方案,如 HTTP (超文本传输协议)、HTTPS (安全的 HTTP )、FTP (文件传输协议)或 其他。
此 URL 中的 scheme 是 https
。
Host: 主机指定了托管资源的服务器的域名或 IP 地址。
此 URL 中的 host 是 example.logto.io
。
Port: (可选)端口表示在主机上访问资源的特定端口号。如果没有指定端口,它默认为给定方案的标准端口。
HTTP 的默认端口是 80 ,而 HTTPS 的默认端口是 443 。
此 URL 中的 port 是 8080
。
Path: (可选)路径指示服务器上资源所在的特定位置或目录,可以包括目录和文件名。
此 URL 中的 path 应为 /blogs/index.html
。
Query parameters: (可选)查询参数是传递给资源的额外参数,通常用于动态网络应用。它们出现在路径之后,由 ?
符号分隔。
此 URL 中的 query parameters 是 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 大多遵循 URL 的相同格式,如 RFC 3986 中所述。
尽管这种 URI 格式与 URL 的相似,但它并不能保证访问 Web 上的所有资源。使用这种格式可以减少命名空间名称冲突。
在上面的部分中,我们介绍了 URL ,它不仅标识资源,还帮助定位资源。所以,实际上,URL 是 URI 的一个适当的子集。
URN 可能不如 URL 和 URI 常见。它代表 "统一资源名称",其范围是以持久的方式标识资源,即使这些资源不再存在。
与 URL 不同,URN 不提供任何关于如何定位资源的信息;它只是标识它,就像一个纯 URI 一样。具体来说,URN 是一种带有 "urn" 方案的 URI ,其结构如 RFC 2141 中所述:
<URN>:<NID>:<NSS>
urn
。例如,一本非常著名的介绍计算机系统的书 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 。
如果有任何想法,欢迎大家讨论。更多文章请见我们的 博客。