题 URI,URL和URN有什么区别?


人们谈论 网址S, URIs和 好像他们是不同的东西,但肉眼看起来一样。

它们之间有什么区别?


3710
2017-10-06 21:26


起源


URL比URI更具体。 - mk12
Tor网站管理员接受了这个问题: URI和URL有什么区别 - hippietrail
迷你维恩图: ( URIs ( URLs ) ) - icc97
关于URI与URL似乎仍然存在很多混淆,即使那些试图回答这个问题的人也是如此。每个人都可以看到非URI的URL的实际示例,非URL的URI示例以及URL的示例 和 的URI。 - Dennis
凯西:“那是你的狗吗?”鲍勃:“把他称为犬是更正确的。”凯西:“不,他是一只狗。你,先生,是一个学究。” - Yojimbo


答案:


RFC 3986

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

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

编辑:我以前认为所有的URL都是有效的URI,但根据评论:

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

不幸的是,这使得水更加混乱。

如果你还没有读过 罗杰帕特的回答,我也建议这样做。


1516
2017-10-06 21:29



只有urn:scheme的URI才是URN。 URI可以是经典URL,URN,也可以只是不以“urn:”开头的URI,也不是指资源的位置。 - Mark Cidade
请注意,很久以前RFC 3986已经废弃了RFC 2396(但这不会改变事实......) - Julian Reschke
不 “所有URL都是URI“。这取决于RFC的解释。例如在Java中,URI解析器不喜欢 [ 要么 ] 那是因为规范说“不应该”而不是“不应该”。 - Adam Gent
@AdamGent:RFC 3986 1.1.3:“URI可以进一步分类为定位符,名称或两者。”因此,如果URL是一种特殊的URI,那意味着每个URL都是一个URI。不是吗? - Hubert
@AdamGent:这听起来像Java实现的怪癖,而不是规范性的。该 java.net.URI DOC 本身说“每个URL都是一个URI,抽象地说,但不是每个URI都是一个URL”。和 java.net.URL 通过将主机名解析为IP地址来检查URL的相等性(这看起来与RFC 3986第6版首先不一致,并打破了虚拟主机)。我认为这只意味着Java标准库有一些不一致的类行为。 - Andrew Janke


URI确定 和 网址找到了;然而, 定位器也是标识符,因此每个URL也是一个URI,但有些URI不是URL。

例子

  • 罗杰佩特

这是我的名字,这是一个标识符。 它就像一个URI,但不能是一个URL,因为它不会告诉你我的位置或如何联系我。 在这种情况下,它也恰好在美国仅识别至少5个其他人。

  • 巴哈马拿骚西湾街4914号

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

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

流行的困惑

维基百科

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

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

URN的

我的名字罗杰帕特可能就像一个  (统一资源名称),除了那些 受到更多监管 并且意图是独一无二的  空间和时间。

因为我目前与其他人分享这个名字,所以它不是全球唯一的,也不适合作为URN。然而,即使没有其他家庭使用这个名字,我也以我的祖父的名字命名,所以它在时间上仍然不会是独一无二的。即便如此  事实并非如此,在我之后命名我的后代的可能性使其不适合作为URN。

URN与此刚性唯一性约束中的URL不同,即使它们都共享URI的语法。


3524
2017-12-31 06:32



URNs are different from URLs in this rigid uniqueness constraint 这是否意味着URL不能唯一标识位置? - eugene
罗杰的回答提供了良好的实用建议。对于官方回答,我去了W3C发表的“URI,URL和URN:澄清和建议简而言之,W3C表示当代观点认为一切都是一个URI.URL是一个非正式的概念,而不是一个正式的概念。而混淆可以追溯到一个“古典观点”,它试图严格区分URI(其中一个URL是一个类别)。 - netjeff
..a统一资源定位符(URL)..指定已识别资源的可用位置 以及检索它的机制。 换句话说,没有“相对”URL这样的东西? - Arne
是“earth128:Edward-de-Leau / 6000000000569063853”(多重多元宇宙的独特之处)URN,URL还是URI? - edelwater
@edelwater:我想这是一个uri,因为它只能识别你,但没有说明如何找到你,除非你的意思是earth128是行星间旅行的媒介:) - user20358


URI - 统一资源标识符

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

网址 - 统一资源定位器

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

  • 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: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,而不是将其定位在互联网上或命名。一个例子是 data:,Hello%20World


经常问的问题

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

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

任何浏览器实际上都知道如何通过URN获取文档吗?

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

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

不。相对和绝对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文档类型中使用的URI,例如 http://www.w3.org/TR/html4/strict.dtd。即使w3.org网站上的页面被删除,该URI仍会继续命名HTML4过渡文档类型。


URI/URL Venn Diagram


476
2018-03-04 21:51



是“C:\ myfile”是URI,URL还是URN?或者都不是。 - bvdb
除非您输入文件路径,否则文件路径不是URL或URI file:// 它上面的前缀。虽然浏览器通常会处理非URL格式的文件路径。 Mozilla发布了他们的文件URL测试用例。 - Stephen Ostermiller
他们为什么“统一”? - hkBattousai
看到 RFC的第1.1节  - “Uniformity提供了几个好处。它允许在同一个上下文中使用不同类型的资源标识符,即使用于访问这些资源的机制可能不同。它允许跨不同类型的资源标识符对通用语法约定进行统一的语义解释......” - Stephen Ostermiller
这个答案更容易理解。我可以看到URL和URN的真实示例的清晰图片。任何人都可以阅读更多关于这一点...... danielmiessler.com/study/url-uri - vee


综上所述: URI标识,URL标识和定位。

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

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

您还可以将文本标识为 file://hostname/sharename/RomeoAndJuliet.pdf
这也是一个URI,但更具体地说是一个 网址 因为它 找到文本

*统一资源名称

(请注意,我的示例改编自 维基百科


233
2017-12-31 06:51



注意实际的URN(看看它与URL的比较)会很有帮助:urn:isbn:0-486-27557-4 - Michael Brewer-Davis
@迈克尔 - 这是我的理解 ISBN 0486275574 也命名文本,因此有资格作为URN。我选择了一种我认为对读者来说更熟悉的格式。 - Greg
那么说文件的哈希值(例如SHA1)可能是该文件的URN是否有意义? - johnsimer
@johnsimer不要这么认为,因为你可能在同一台计算机上有一个文件的副本,这会产生相同的哈希,因此它不是唯一的。 - Dennis98


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

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

URI  - /some/page.html

简而言之,URL是在任何地方识别任何资源的完整方式,可以使用不同的协议,如FTP,HTTP,SCP等。

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

在CodeIgniter使用单词URL或URI的每个实例中,这是他们所讨论的差异,尽管在网络的宏观方案中,它并非100%正确。


125
2017-12-31 08:58



这个答案可能过于简化,但请看他的问题的背景。关于XML命名空间的问题对他来说会更有帮助! - Phil Sturgeon
这个答案不仅错误而且积极误导。 都 例子是URL。由于每个URL也是一个URI,这意味着 都 例子是URI。为了演示URI和URL之间的区别,这完全没用。 - Jörg W Mittag
就CodeIgniter而言,这是不同的。在每个实例中,他们都使用URL或URI这个词,这就是他们所谈论的差异。因此,在网络的宏观方案中,它不是100%正确,但在OP的问题范围内(CodeIgniter的差异),这个答案是完全正确的。 - Phil Sturgeon
这是错的。 @JörgWMittag主要关注点。 URL是URI,它们是“完全合格的”;所以这个答案中的“URL”都是。但 /some/page.html 不是URI。它是一个“relative-ref”,它是一种“URI-reference”。结合基本URI上下文,可以将其解析为URI,但本身不是URI。看到 RFC 3986的4.1节。 CodeIgniter可能使用错误的术语,应该调用; Q(当前编辑的)不构成CodeIgniter特定的。 - Andrew Janke
对于阅读这些评论并且和我一样困惑的未来人们:这个问题的答案没有发布。这个问题从未与CodeIgniter有任何关系。有一个重复的问题,特别提到CodeIgniter已关闭,并将其所有答案迁移到这个问题。这个答案是从旧的封闭问题转移到这个受保护的问题之一。即便如此,我的回答也是误导。我对它进行了贬低 - 其他人应该这样做,因为在新家里,这是错误的。作者应删除它或合并撤消。 - ArtOfWarfare


已经发布的答案的一小部分,这里是维恩的图表来总结理论(来自Prateek Joshi的美丽 说明):

enter image description here

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

enter image description here


64
2017-10-16 17:46



我相信第二个插图是不正确的。按规格说明 url.spec.whatwg.org/#url-writing  URL必须写为相对URL或绝对URL,可选地后跟“#”和片段。所以, #posts 片段标识符可以是URL的一部分 - ruvim
这是完全错误的 - Engineer Dollery
这两个插图相互矛盾。 - patapouf_ai


这是我作为网络专业人士遇到的最令人困惑且可能无关的话题之一。

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

有两个基本子集 - URL,用于定义位置(尤其是用于查找网页的浏览器)和URN,用于定义某些内容的唯一名称。

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

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

如果我离开基地 - 请告诉我!


52
2017-12-01 13:07



不,我认为你是对的。 URI vs URL vs URL vs URI-ref等的语义对大多数开发人员来说都是无用的,只是因为它推动了无意义(非生产性,无关紧要的决策)辩论。如果使用了Google API redirect_url 代替 redirect_uri,有人真的在乎吗? - Alexander Pritchard


首先让你的思绪摆脱困惑,并把它简单化,你就会理解。

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

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


44
2017-07-21 17:50



好,短,易懂,清晰答案!!! - Björn Hallström


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

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

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


42
2017-10-06 21:30



URL不是URI的真正子集。您可以使用字符制作vaid URL [ 和 ] 但不是URI。 - Adam Gent
方括号在URI或URL中无效。看到这个问题有很多参考规格: 网址中是否允许使用方括号?。当方括号出现时,它们应该被编码。 - Stephen Ostermiller


在考虑URI时我喜欢使用的另一个例子是XML文档的xmlns属性:

<rootElement xmlns:myPrefix="com.mycompany.mynode">
    <myPrefix:aNode>some text</myPrefix:aNode>
</rootElement>

在这种情况下,com.mycompany.mynode将是一个URI,它唯一地标识在我的XML文档中使用它的所有元素的“myPrefix”命名空间。这不是URL,因为它仅用于识别,而不是用于定位本身。


35
2017-12-31 07:38





标识符=名称+位置

每个网址(üniform [Resource 大号ocator)是一个URI(üniform [Resource 一世dentifier),抽象地说,但每个URI都不是URL。 URI的另一个子类别是URN(üniform [Resource ñame),这是一个命名资源,但没有指定如何定位它们,如mailto,news,ISBN是URI。

enter image description here

URN的语法:  [scheme:]scheme-specific-part[#fragment] 

例子:
邮寄地址:java-net@java.sun.com
新闻:comp.lang.java
金塔:ISBN:096139210x

URL语法:  [scheme:][//authority][path][?query][#fragment] 

例子:
http://java.sun.com/j2se/1.3/     文档/导向/集合/ designfaq.html#28
../../../demo/jfc/SwingSet2/src/SwingSet2.java
文件://host/dir/myfile.txt

资源

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


31
2017-12-23 11:45