V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
logto
V2EX  ›  程序员

什么是 URI, URL 和 URN?

  •  2
     
  •   logto ·
    logto-io · 187 天前 · 1566 次点击
    这是一个创建于 187 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在开发 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 。


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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2801 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 14:34 · PVG 22:34 · LAX 06:34 · JFK 09:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.