URI,URL 和 URN 有什么区别?

人们谈论URLURIURN好像是不同的东西,但是用肉眼看起来都是一样的。

它们之间有什么明显区别?

答案

URI标识URL定位 ; 但是, 定位符也是标识符 ,因此每个 URL 也是一个 URI,但是有些 URI 并非 URL。

例子

  • 罗杰 · 佩特

这是我的名字,它是一个标识符。它就像一个 URI,但不能是 URL,因为它不会告诉您有关我的位置或如何与我联系的信息。在这种情况下,仅在美国,也至少要识别出另外 5 个人。

  • 4914 West Bay Street,拿骚,巴哈马

这是一个定位器,是该物理位置的标识符。就像 URL 和 URI(因为所有 URL 都是 URI)一样,它也间接将我标识为 “.. 的居民”。在这种情况下,它唯一地标识了我,但是如果我得到室友,那将会改变。

我说 “喜欢” 是因为这些示例未遵循所需的语法。

大众的困惑

维基百科

在计算中,统一资源定位符(URL)是统一资源标识符(URI)的子集,用于指定所标识资源的可用位置以及检索该资源的机制。 在流行用法以及许多技术文档和口头讨论中,它通常被错误地用作 URI 的同义词 ,... [强调我的]

由于这种常见的混淆,许多产品和文档错误地使用了一个术语而不是另一个术语,分配了自己的区别或同义地使用它们。

URN

我的名字叫罗杰 · 佩特(Roger Pate),可能像URN (统一资源名称)一样,除了那些受到更严格的监管并且打算在时空上都是唯一的。

由于我目前与其他人共享此名称,因此它在全球范围内并不唯一,因此不适合用作 URN。但是,即使没有其他家庭使用过这个名字,我还是以我的祖父的名字命名的,因此它在时间上仍然不是唯一的。即使是不是这样,我以后命名我的后代的可能性,使这个不适合作为 URN。

尽管 URN 都共享 URI 的语法,但它们在严格的唯一性约束方面与 URL 不同。

RFC 3986

URI 可以进一步分类为定位符,名称或两者。术语 “统一资源定位符”(URL)指的是 URI 的子集,除了标识资源外,它还通过描述资源的主要访问机制(例如,其网络 “位置”)提供了一种定位资源的方式。历史上一直使用术语 “统一资源名称”(URN)来指代 “urn” 方案[RFC2141]下的两个 URI,即使资源不再存在或变得不可用,URI 也必须保持全局唯一性和持久性。具有名称属性的任何其他 URI。

因此,所有 URL 都是 URI(实际上并不完全 - 参见下文),所有 URN 都是 URI - 但是 URN 和 URL 不同,因此您不能说所有 URI 都是 URL。

编辑:我以前曾认为所有 URL 是有效的 URI,但根据注释:

不是 “所有 URL 都是 URI”。它取决于 RFC 的解释。例如,在 Java 中,URI 解析器不喜欢[] ,这是因为规范说 “应该” 而不是 “不应该”。

不幸的是,这进一步使水更加浑浊。

如果您还没有阅读Roger Pate 的答案 ,我建议您也这样做。

URI- 统一资源标识符

URI 是使用简短的数字,字母和符号字符串标识文档的标准。它们由RFC 3986 - 统一资源标识符(URI):通用语法定义 。 URL,URN 和 URC 都是 URI 类型

URL- 统一资源定位器

包含有关如何从其位置获取资源的信息。例如:

  • http://example.com/mypage.html
  • ftp://example.com/download.zip
  • mailto:user@example.com
  • file:///home/user/file.txt
  • tel:1-888-555-5555
  • http://example.com/resource?foo=bar#fragment
  • /other/link.html (相对 URL,仅在另一个 URL 的上下文中有用)

URL 始终以协议( http )开头,并且通常包含诸如网络主机名( example.com )之类的信息,并且通常包含文档路径( /foo/mypage.html )。 URL 可能具有查询参数和片段标识符。

URN- 统一资源名称

通过唯一且持久的名称来标识资源,但不一定告诉您如何在 Internet 上定位它。通常以前缀urn:开头urn:例如:

  • urn:isbn:0451450523以其 ISBN 号标识一本书。
  • urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66一个全局唯一标识符
  • urn:publishing:book一个 XML 名称空间,用于将文档标识为书籍类型。

URN 可以识别想法和概念。它们不限于识别文件。如果 URN 确实表示文档,则可以通过 “解析器” 将其转换为 URL。然后可以从 URL 下载该文档。

URC - 统一资源引用

指向有关文档的元数据,而不是文档本身。 URC 的一个示例指向页面的 HTML 源代码,例如: view-source:http://example.com/

数据 URI

可以将数据直接放置到 URI 中,而不必在 Internet 上定位或命名。一个例子是data:,Hello%20World


经常问的问题

我听说我不应该再说 URL,为什么?

HTML 的 W3 规范指出, 定位标记href可以包含 URI,而不仅仅是 URL。您应该能够放入诸如<a href="urn:isbn:0451450523">类的 URN。然后,您的浏览器会将该 URN 解析为一个 URL,并为您下载该书。

是否有任何浏览器实际上知道如何通过 URN 提取文档?

我不知道,但是现代的 Web 浏览器确实实现了数据 URI 方案。

URL 和 URI 之间的区别是否与相对还是绝对有关?

否。相对 URL 和绝对 URL 都是 URL(和 URI)。

URL 和 URI 之间的区别是否与查询参数有关?

否。带有和不带有查询参数的 URL 都是 URL(和 URI)。

URL 和 URI 之间的区别是否与片段标识符有关?

否。带有和不带有片段标识符的 URL 都是 URL(和 URI)。

URL 和 URI 之间的区别是否与允许使用哪些字符有关?

否。URL 被定义为 URI 的严格子集。如果解析器允许 URL 中的字符但不允许 URI 中的字符,则解析器中存在错误。规范非常详细地介绍了 URL 和 URI 的哪些部分允许使用哪些字符。某些字符可能仅在 URL 的某些部分才被允许,但仅字符不是 URL 和 URI 之间的区别。

但是 W3C 现在不是说 URL 和 URI 是同一回事吗?

是。 W3C 意识到对此存在很多困惑。他们发布了URI 澄清文档 ,指出现在可以将 URL 和 URI 互换使用(表示 URI)。将 URI 严格划分为不同类型(例如 URL,URN 和 URC)不再有用。

URI 既可以是 URL 又可以是 URN 吗?

现在,URN 的定义比我上面所述的宽松。 最新的 URI RFC 规定 ,任何 URI 现在只要具有 “名称的属性”,就可以成为 URN(无论它是否以urn:开头)。也就是说:即使资源不再存在或变得不可用,它也具有全局唯一性和持久性。例如:HTML 文档类型(例如http://www.w3.org/TR/html4/strict.dtd使用的 URI。即使删除了 w3.org 网站上的页面,该 URI 仍将继续命名 HTML4 过渡文档类型。


URI / URL维恩图

概括而言: URI 标识,URL 标识和定位。

考虑一下莎士比亚戏剧《 罗密欧与朱丽叶》的特定版本,您的家庭网络上有其数字副本。

您可以将文本标识为urn:isbn:0-486-27557-4
那将是一个 URI,但更具体地说是URN *,因为它命名了 text

您也可以将文本标识为file://hostname/sharename/RomeoAndJuliet.pdf
那也将是 URI,但更具体地说是URL,因为它可以找到 text

* 统一资源名称

(请注意,我的示例改编自Wikipedia

这是一些写得很好但是冗长的答案。 就 CodeIgniter 而言,这是区别:

网址 -http://example.com/some/page.html

URI - /some/page.html

简而言之,URL 是识别任何地方任何资源的完整方法,并且可以具有不同的协议,例如 FTP,HTTP,SCP 等。

URI 是当前域上的资源,因此需要的信息较少。

在每种情况下,CodeIgniter 都使用 URL 或 URI 一词,这就是他们在谈论的区别,尽管在网络的宏伟计划中,它并不是 100%正确的。

首先,让您的头脑摆脱混乱,简单点,您就会明白。

URI => 统一资源标识符标识资源的完整地址,即位置,名称或两者。

URL => 统一资源定位符标识资源的位置。

URN => 统一资源名称标识资源名称

我们的地址为https://www.google.com/folder/page.html

URI(统一资源标识符)=> https://www.google.com/folder/page.html

URL(统一资源定位符)=> https://www.google.com/

URN(统一资源名称)=> /folder/page.html

URI =>(URL + URN)或仅 URL 或仅 URN

除了已经发布的答案之外,这里还有一小部分是维恩图,用于总结理论(摘自 Prateek Joshi 的优美解释 ):

在此处输入图片说明

还有一个例子(也来自 Prateek 的网站):

在此处输入图片说明

这是我作为 Web 专业人员遇到的最令人困惑且可能不相关的主题之一。

据我了解,URI 是遵循可接受格式的对事物的描述,可以定义事物的唯一名称(标识)或位置。

有两个基本的子集 - URL(用于定义位置(尤其是尝试浏览网页的浏览器))和 URN(用于定义事物的唯一名称)。

我倾向于认为 URN 与 GUID 类似。它们只是提供事物唯一名称的标准化方法。就像在使用公司名称的名称空间声明中一样 - 就像服务器上不存在资源来对应该文本行一样 - 它只是唯一地标识事物。

我也倾向于完全避免使用 URI 一词,而仅在适当的地方仅使用 URL 或 URN 来讨论,因为这会引起很多混乱。我们真正应该为人们回答的问题不是语义,而是如何在遇到术语时识别它们之间是否存在任何实际差异,这将改变编程情况的方法。例如,如果有人在对话中纠正我,并说:“哦,那不是 URL,而是 URI”,我知道他们已经充满了。如果有人说 “我们正在使用 URN 定义资源”,我很有可能会理解我们只是对其进行唯一命名,而不是将其定位在服务器上。

如果我离基地很远 - 请让我知道!

身份 = 名称和位置

每一个URL(U niform 方案资源大号 ocator)是一个URI(U niform 方案资源 dentifier),抽象地讲,但每个 URI 是不是一个 URL。还有 URI 的另一个子类别URN(U niform 方案资源ñAME),这是一种命名资源但不指定如何定位他们,例如 mailto,新闻,国际标准书号是的 URI。 资源

在此处输入图片说明

瓮:

  • URN 格式: urn:[namespace identifier]:[namespace specific string]
  • :和:站起来。
  • 例子
    • ur:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66
    • 骨灰盒:ISSN:0167-6423
    • ur:isbn:096139210x
    • 亚马逊资源名称(ARN)是唯一标识 AWS 资源。
      • ARN 格式: arn:partition:service:region:account-id:resource

网址:

  • URL 格式: [scheme]://[Domain][Port]/[path]?[queryString]#[fragmentId]
  • :,// ,? 和#代表自己。
  • 方案是 https,ftp,gopher,mailto,新闻,telnet,文件,man,info,whatis,ldap ...
  • 例子:

比喻:
与某人联系:驾驶(协议其他人的 SMS,电子邮件,电话),地址(主机名,其他电话号码,emailid)和人名(带有相对路径的对象名)。

URI => http://en.wikipedia.org/wiki/Uniform_Resource_Identifier

URL 是 URI(也包含 URN)的子集。

基本上,URI 是通用标识符,其中 URL 指定位置,URN 指定名称。