URI,URL和URN有什么区别?

时间:2008-10-06 21:26:58

标签: http url uri urn rfc3986

人们谈论网址 URI URN ,就好像它们是不同的东西,但它们看起来一样肉眼。

它们之间有什么区别?

32 个答案:

答案 0 :(得分:3716)

URI标识 URL s locate ;但是,定位器也是标识符,因此每个URL也是一个URI,但是有些URI不是URL。

实施例

  • Roger Pate

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

  • 4914 West Bay Street,Nassau,Bahamas

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

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

流行的混乱

来自Wikipedia

  

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

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

的URN

我的名字Roger Pate可能类似于URN(统一资源名称),除了那些much more regulated并且打算在 空间和时间内都是唯一的。

因为我目前与其他人分享这个名字,所以它不是全球唯一的,也不适合作为URN。然而,即使没有其他家庭使用这个名字,我也是以我的祖父的名字命名的,所以它在一段时间内仍然不会是唯一的。即使 不是这种情况,在我之后命名我的后代的可能性使其不适合作为URN。

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

答案 1 :(得分:1651)

来自RFC 3986

  

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

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

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

  

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

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

如果您还没有阅读Roger Pate's answer,我也建议您这样做。

答案 2 :(得分:579)

URI - Uniform Resource Identifier

URI是使用短数字,字母和符号标识文档的标准。它们由RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax定义。 URL,URN和URC都是URI的类型

网址 - Uniform Resource Locator

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

  • 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(相对网址,仅在其他网址的上下文中有用)

网址始终以协议(http)开头,通常包含网络主机名(example.com)等信息,通常还包含文档路径(/foo/mypage.html)。 URL可能包含查询参数和片段标识符。

URN - Uniform Resource Name

通过唯一且持久的名称标识资源,但不一定告诉您如何在互联网上找到它。它通常以前缀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/

Data URI

不是将数据放在互联网上或命名,而是将数据直接放入URI中。一个例子是data:,Hello%20World


常见问题

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

HTML的W3规范说href of an anchor tag可以包含URI,而不仅仅是URL。您应该能够放入<a href="urn:isbn:0451450523">等URN。然后,您的浏览器会将该URN解析为URL并为您下载该书。

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

我不知道,但现代网页浏览器确实实现了数据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 clarification document,表示现在可以互换使用术语URL和URI(表示URI)。将URI严格分段为不同类型(如URL,URN和URC)不再有用。

URI可以是URL还是URN?

URN的定义现在比我上面所说的更宽松。 latest RFC on URIs表示任何URI现在都可以是URN(无论它是否以urn:开头),只要它具有&#34;名称的属性。&#34;即:即使资源不再存在或变得不可用,它仍具有全局唯一性和持久性。示例:HTML文档类型中使用的URI,例如http://www.w3.org/TR/html4/strict.dtd。即使w3.org网站上的页面被删除,该URI仍将继续命名HTML4过渡文档类型。


URI/URL Venn Diagram

答案 3 :(得分:246)

总结: URI标识,URL标识并定位。

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

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

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

*统一资源名称

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

答案 4 :(得分:135)

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

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

URI - /some/page.html

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

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

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

答案 5 :(得分:78)

首先让您的思绪摆脱困惑,并将其简单化,您将会理解。

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

网址=&gt;统一资源定位器 标识资源的位置。

URN =&gt;统一资源名称 标识资源的名称

示例

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

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

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

URN(统一资源名称)=&gt; /folder/page.html

URI =&gt; (URL + URN)或仅限URL或仅限URN

答案 6 :(得分:63)

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

enter image description here

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

enter image description here

答案 7 :(得分:53)

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

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

有两个基本子集 - URL,用于定义位置(特别是对于试图查找网页的浏览器)和URN,它们定义了某些内容的唯一名称。

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

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

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

答案 8 :(得分:44)

  

标识符=名称+位置

每个网址( U niform R esource L ocator)都是一个URI( U niform R esource I dentifier),抽象地说,但每个URI都不是URL。 URI的另一个子类别是URN( U niform R esource N ame),这是一个命名资源,但没有指定如何定位他们,像mailto,新闻,ISBN是URI。 Source

enter image description here

URN:

  • URN格式:urn:[namespace identifier]:[namespace specific string]
  • urn:and:代表自己。
  • Examples
    • urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66
    • urn:ISSN:0167-6423
    • urn:isbn:096139210x
    • Amazon Resource Names (ARNs)是唯一标识AWS资源的。
      • ARN格式:arn:partition:service:region:account-id:resource

网址:

  • 网址格式:[scheme]://[Domain][Port]/[path]?[queryString]#[fragmentId]
  • :,// ,?和#代表自己。
  • 方案是https,ftp,gopher,mailto,news,telnet,f​​ile,man,info,whatis,ldap ......
  • 实施例:

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

答案 9 :(得分:42)

URI =&gt; http://en.wikipedia.org/wiki/Uniform_Resource_Identifier

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

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

答案 10 :(得分:35)

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

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

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

答案 11 :(得分:28)

由于难以清楚地区分URI和URL,据我所知,W3C在URI和URL(http://www.w3.org/Addressing/)之间不再有任何区别。

答案 12 :(得分:26)

They're the same thing。 URI是URL的泛化。最初,URI计划分为URL(地址)和URN(名称),但是URL和URI之间没有什么区别,http URI被用作命名空间,即使它们实际上没有找到任何资源。

答案 13 :(得分:23)

URI and URL

  

URI,URL,URN

如上图所示,这里有三个不同的组成部分。在讨论这些问题时,通常最好去消息来源,所以这里是Tim Berners-Lee等人的一个例子。人。在 RFC 3986: Uniform Resource Identifier (URI): Generic Syntax:

  

统一资源标识符(URI)是一个紧凑的序列   标识抽象或物理资源的字符。

     

URI可以进一步分类为定位符,名称或两者。该   术语“统一资源定位符”(URL)是指URI的子集   除了识别资源外,还提供了一种方法   通过描述其主要访问机制来定位资源   (例如,其网络“位置”)。

答案 14 :(得分:20)

URI是URL和URN的超类。维基百科有fine article关于它们的链接,指向正确的RFC集。

答案 15 :(得分:16)

<强>网址

URL是URI的特化,用于定义特定资源的网络位置。与URN不同,URL定义了如何获取资源。我们每天都会以http://example.com等形式使用网址。但网址不一定是HTTP网址,也可以是ftp://example.com等。

<强> URI

URI按位置或名称或两者标识资源。通常,我们大多数人使用URI来定义资源的位置。 URI可以通过名称和位置来识别资源这一事实在我看来引起了很多混乱。 URI有两个称为URL和URN的特化。

网址和URI之间的差异

URI是某些资源的标识符,但URL会为您提供获取该资源的具体信息。 URI是一个URL,正如一位评论者所指出的,现在认为在描述应用程序时使用URL是不正确的。通常,如果URL描述资源的位置和名称,则使用的术语是URI。由于这通常是我们大多数人每天都遇到的情况,因此URI是正确的术语。

答案 16 :(得分:16)

维基百科将在此提供您需要的所有信息。引自http://en.wikipedia.org/wiki/URI

  

URL是一种URI,除了标识资源之外,还提供了通过描述其主要访问机制或网络“位置”来处理或获取资源表示的方法。

答案 17 :(得分:15)

根据RFC 3986,URI由以下部分组成:

scheme://authority/path?query

URI描述了在服务器( authority )上访问资源(路径)或应用程序(查询)的协议。

Enter image description here

所有URL都是URI,所有URN都是URI,但所有URI都不是URL。

请参阅更多详情:

  

Wikipedia

答案 18 :(得分:13)

URI按位置或名称或两者标识资源。通常,我们大多数人使用URI来定义资源的位置。 URI可以通过名称和位置来识别资源这一事实在我看来引起了很多混乱。 URI有两个称为URL和URN的特化。

URL是URI的特化,用于定义特定资源的网络位置。与URN不同,URL定义了如何获取资源。我们每天都会以http://stackoverflow.com等形式使用网址。但网址不一定是HTTP网址,也可以是ftp://example.com等。

答案 19 :(得分:11)

尽管严格定义了术语URI和URL,但很多人将这些术语用于除定义之外的其他内容。

我们以Apache为例。如果从Apache服务器请求http://example.com/foo,您将设置以下环境变量:

  • REDIRECT_URL/foo
  • REQUEST_URI/foo

启用mod_rewrite后,您还将拥有以下变量:

  • REDIRECT_SCRIPT_URL/foo
  • REDIRECT_SCRIPT_URIhttp://example.com/foo
  • SCRIPT_URL/foo
  • SCRIPT_URIhttp://example.com/foo

这可能是造成某些混淆的原因。

答案 20 :(得分:10)

阅读完帖子后,我发现了一些非常相关的评论。简而言之,URL和URI定义之间的混淆部分取决于哪个定义取决于哪个以及在软件开发中非正式使用单词URI。

根据定义,URL是URI [RFC2396]的子集。 URI包含URN和URL。 URI和URL都有自己特定的语法,赋予它们URI或URL的状态。 URN用于唯一标识资源,而URL用于定位资源。请注意,资源可以包含多个URL,但只能包含一个URN。[RFC2611]

作为Web开发人员和程序员,我们几乎总是关注URL,因此关注URI。现在,URL被明确定义为具有所有部分方案:scheme-specific-part,例如https://stackoverflow.com/questions。这是一个URL,它也是一个URI。现在考虑页面中嵌入的相对链接,例如../index.html。根据定义,这不再是URL。它仍然被称为“URI参考”[RFC2396]。

我相信当使用单词URI来引用相对路径时,“URI-reference”实际上就是被考虑的内容。非正式地,软件系统使用URI来指代绝对地址的相对路径和URL。所以从这个意义上讲,相对路径不再是URL,而是URI。

答案 21 :(得分:10)

this document。具体来说,

  

URL是一种URI,它通过其主要访问机制(例如,其网络“位置”)的表示来标识资源,而不是通过它可能具有的某些其他属性来标识资源。

这真的不是一个非常明确的术语。

答案 22 :(得分:9)

我想知道同样的事情,我发现了这个:http://docs.kohanaphp.com/helpers/url

您可以使用url::current()方法查看明确的示例。 如果您有网址http://example.com/kohana/index.php/welcome/home.html?query=string,那么使用url:current()会为您提供 URI ,根据文档,它是: welcome /家

答案 23 :(得分:9)

这是我的简化:

URN:唯一的资源名称,即“what”(例如urn:issn:1234-5678)。这是唯一的..因为没有两个不同的文档可以有相同的urn。有点像“uuid”

网址:“在哪里”找到它(例如https://google.com/pub?issnid=1234-5678 ..或                              ftp://somesite.com/doc8.pdf

URI:可以是URN或URL。这种模糊定义归功于W3C和IETF制作的RFC 3986。

多年来,URI的定义发生了变化,因此让大多数人感到困惑是有道理的。但是,您现在可以放心,因为您可以将http://somesite.com/something称为URL或URI ...您将是正确的(至少暂时无论如何......)

答案 24 :(得分:7)

URI源于需要以统一和连贯的方式识别Web上的资源,和其他Internet资源,例如电子邮箱。因此,可以引入一种新类型的小部件: URI来识别小部件资源或使用 tel: URI来使网络链接导致电话呼叫在被调用时被制作。

某些URI提供了查找资源的信息(例如DNS主机名和该计算机上的路径),而某些URI则用作纯资源名称。 网址保留用于是资源定位器的标识符,包括“http”网址,例如 http://stackoverflow.com ,用于标识主机上给定路径的网页。另一个例子是'mailto'URL,例如 mailto:fred@mail.org ,它标识给定地址的邮箱。

URN 是用作纯资源名称而不是定位符的URI。例如,URI: mid:0E4FC272-5C02-11D9-B115-000A95B55BC8@stackoverflow.com 是一个URN,用于在“Message-Id”字段中标识包含它的电子邮件消息。 URI用于区分该消息与任何其他电子邮件消息。但它本身并不在任何商店提供消息的地址。

答案 25 :(得分:6)

易于解释:

让我们假设以下

URI是您的姓名

网址是您的姓名地址,以便与您沟通。

  • 我的名字是Loyola

    Loyola是URI

  • 我的地址是TN,Chennai 600001。

TN,Chennai 600 001,Loyola是URL

希望你明白,

现在让我们看一个精确的例子

<强> http://www.google.com/fistpage.html

在上面,您可以与名为 firstpage.html 的页面进行通信 ( URI )使用以下 http://www.google.com/fistpage.html 网址)。

因此URI是URL的子集,但反之亦然。

答案 26 :(得分:6)

为了回答这个问题,我会依靠an answer I modified to another question。 URI的一个很好的例子是您如何识别Amazon S3资源。我们来看看:

s3://www-example-com/index.html [图] 1]

我创建的

的缓存副本

http://www.example.com/index.html [图] 2]

在亚马逊的 S3-US-West-2 数据中心。

即使StackOverflow允许我超链接到s3:// protocol方案,它也不会对定位资源有任何帮助。因为标识 资源无花果。 1 是有效的URI。它也是一个有效的URN,因为Amazon要求数据包(它们的URI的authority部分的术语)在数据中心之间是唯一的。找到它时有用,但它不表示数据中心。因此它不能用作URL。

那么,在这种情况下,URI,URL和URN有何不同?

注意: RFC 3986将URI定义为scheme://authority/path?query#fragment

答案 27 :(得分:5)

最好的(技术)摘要 imo 是这个

IRI, URI, URL, URN and their differences,来自Jan Martin Keil:

IRI,URI,URL,URN及其区别

每个处理语义网的人都会反复遇到 IRI URI URL URN 。但是,我经常观察到它们的确切含义有些混淆。而且,当然,其他人也注意到了这一点(例如参见RFC3305或在Google上搜索)。老实说,一开始我什至感到困惑。但是实际上问题并不那么复杂。让我们看一下这些术语的定义,看看有什么区别:

URI

统一资源标识符是紧凑的字符序列,用于标识抽象资源或物理资源。字符集仅限于US-ASCII,不包括某些保留字符。可以使用百分比编码来表示允许的字符集之外的字符。 URI可以用作定位器,名称或两者兼有。如果URI是定位符,则它描述资源的主要访问机制。如果URI是名称,则通过给它提供唯一的名称来标识资源。 URI的语法和语义的确切规范取决于所使用的Scheme,该方案由第一个冒号之前的字符定义。 [RFC3986]

URN

统一资源名称是方案urn中的URI,旨在用作持久的,与位置无关的资源标识符。从历史上看,该术语也指任何URI。 [RFC3986] URN由名称空间标识符(NID)和名称空间特定字符串(NSS)组成:urn :: NSS的语法和语义是特定于每个NID的。除了已注册的NID,还有其他几个未经过正式注册流程的NID。 [RFC2141]

URL

统一资源定位器是一个URI,除了标识资源外,还通过描述其主要访问机制[RFC3986]提供了一种定位资源的方法。由于没有通过一组Scheme来精确定义URL,因此“ URL是一个有用但非正式的概念”,通常是指不包含URN的URI子集[RFC3305]。

IRI

国际化资源标识符的定义类似于URI,但是字符集扩展为通用编码字符集。因此,它可以包含保留字符以外的任何拉丁字符和非拉丁字符。并未扩展URI的定义,而是引入了术语IRI,以实现明显的区分并避免不兼容。 IRI旨在在支持通用编码字符集的情况下替换URI来标识资源。根据定义,每个URI都是IRI。此外,有一个IRI到URI的定义性映射:每个IRI都可以精确地映射到一个URI,但是不同的IRI可以映射到相同的URI。因此,从URI转换回IRI可能不会产生原始IRI。 [RFC3987]

总结一下,我们可以说:

IRI is a superset of URI (IRI ⊃ URI)
URI is a superset of URL (URI ⊃ URL)
URI is a superset of URN (URI ⊃ URN)
URL and URN are disjoint (URL ∩ URN = ∅)

语义Web问题的结论

RDF明确允许使用IRI来命名实体[RFC3987]。这意味着我们几乎可以在实体名称中使用每个字符。另一方面,我们经常必须处理早期状态软件。因此,使用非ASCII字符不太可能会出现问题。因此,我建议避免为实体使用非URI名称,并建议使用http URI [LINKED-DATA]。简而言之:仅使用URL命名您的实体。当然,我们可以引用由URN命名的现有实体。但是,我们应该避免重新创建此类标识符。

答案 28 :(得分:4)

统一资源标识符(URI)是一个标识Internet资源的字符串。

最常见的URI是标识Internet域地址的统一资源定位器(URL)。另一种不常见的URI类型是通用资源名称(URN)。

答案 29 :(得分:4)

我找到了:


统一资源标识符(URI)代表了一幅大图。您可以拆分URI / URI可以分类为定位器(统一资源定位符-URL),或者分类为名称(统一资源名称-URN),或者两者兼而有之。所以基本上,URN的功能就像一个人的名字,而URL则描述了该人的地址。长话短说,URN定义了一个项目的标识,而URL提供了定义查找它的方法,最后封装这两个概念就是URI

答案 30 :(得分:0)

答案含糊不清。在Java中,它经常以这种方式使用:

统一资源定位符(URL)是用于标识Internet资源的术语,包括方案(http,https,ftp,news等)。例如What is the difference between a URI, a URL and a URN?

统一资源标识符(URI)用于标识Web服务器中的单个文档:例如/ questions / 176264 / whats-the-uri-and-a-url

在Java servlet中,URI经常引用没有Web应用程序上下文的文档。

答案 31 :(得分:-1)

不要忘记URN。 URI和URL都是URN。网址有一个位置:

URI: foo
URL: http://some.domain.com/foo
URL: http://some.domain.com:8080/foo
URL: ftp://some.domain.com/foo

他们都是URN。