关于HTTP:URI、URL和URN有什么区别?

What is the difference between a URI, a URL and a URN?

人们谈论URL、URI和URN时,好像它们是不同的东西,但肉眼看它们是一样的。

它们之间的区别是什么?


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

实例

  • 罗杰帕特

这是我的名字,它是一个标识符。它类似于一个URI,但不能是一个URL,因为它不会告诉您我的位置或如何联系我。在这种情况下,仅在美国就可以识别出至少5个人。

  • 巴哈马拿骚西湾街4914号

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

我之所以说"like",是因为这些示例不遵循所需的语法。

大众的困惑

维基百科:

In computing, a Uniform Resource Locator (URL) is a subset of the Uniform Resource Identifier (URI) that specifies where an identified resource is available and the mechanism for retrieving it. In popular usage and in many technical documents and verbal discussions it is often incorrectly used as a synonym for URI, ... [emphasis mine]

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

我的名字,罗杰·帕特,可能像一个瓮(统一资源名称),除了那些更规范,并打算在空间和时间上都是独一无二的。

因为我目前与其他人共享这个名称,所以它不是全局唯一的,不适合作为URN。然而,即使没有其他的家庭使用这个名字,我的名字是以我的祖父命名的,所以它仍然不会是独一无二的。即使事实并非如此,用我的名字给我的后代命名的可能性使得这个不适合作为骨灰盒。

URN在这个严格的唯一性约束中不同于URL,尽管它们都共享URI的语法。


来自RFC 3986:

A URI can be further classified as a locator, a name, or both. The
term"Uniform Resource Locator" (URL) refers to the subset of URIs
that, in addition to identifying a resource, provide a means of
locating the resource by describing its primary access mechanism
(e.g., its network"location"). The term"Uniform Resource Name"
(URN) has been used historically to refer to both URIs under the
"urn" scheme [RFC2141], which are required to remain globally unique
and persistent even when the resource ceases to exist or becomes
unavailable, and to any other URI with the properties of a name.

所以所有的URL都是URI(实际上并不是非常——见下文),所有的URL都是URI——但是URL和URL是不同的,所以不能说所有的URI都是URL。

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

Not"all URLs are URIs". It depends on the interpretation of the RFC. For example in Java the URI parser does not like [ or ] and that's because the spec says"should not" and not"shall not".

不幸的是,这使得海水更加浑浊。

如果你还没读过罗杰·帕特的答案,我建议你也读一下。


uri—统一资源标识符

URI是使用数字、字母和符号的短字符串标识文档的标准。它们由RFC3986定义——统一资源标识符(URI):通用语法。URL、URN和URC都是URI的类型。好的。统一资源定位器

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

  • http://example.com/mypage.html
  • ftp://example.com/download.zip
  • mailto:[email protected]
  • 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中,而不是在Internet上定位或命名它。一个例子是data:,Hello%20World。好的。常见问题我听说我不应该再说网址了,为什么?

HTML的W3规范指出锚标记的href可以包含一个URI,而不仅仅是一个URL。你应该能够把一个瓮,如。然后,您的浏览器会将该URN解析为一个URL,并为您下载图书。好的。有没有浏览器真正知道如何通过urn获取文档?

我不知道,但现代Web浏览器确实实现了数据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的定义比我上面所说的要宽松。最新的关于uris的RFC说,任何uri现在都可以是一个urn(不管它是否以urn:开头),只要它具有"名称的属性"。也就是说:它是全局唯一的,并且即使当资源不再存在或变得不可用时也可以持久。例如:HTML doctypes中使用的uri,如http://www.w3.org/TR/html4/strict.dtd。即使删除了w3.org网站上的页面,该URI也会继续命名html4 transitional doctype。好的。

URI/URL Venn Diagram好的。好啊。


总之:一个URI标识,一个URL标识并定位。

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

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

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

*统一资源名称

(注意,我的例子改编自维基百科)


这些是一些写得很好但冗长的答案。以下是代码点火器的区别:

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

uri-/some/page.html

简单地说,URL是识别任何资源的完整方法,可以有不同的协议,如ftp、http、scp等。

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

在CodeIgniter使用单词url或uri的每一个实例中,这就是他们所说的区别,尽管在Web的总体方案中,这不是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 only或urn only


除了已经发布的答案之外,这里还有一个维恩图来总结这个理论(摘自普拉泰克·乔希的美丽解释):

enter image description here

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

enter image description here


这是我作为一个网络专业人员遇到的最混乱和可能不相关的话题之一。

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

有两个基本的子集:URL,它定义位置(尤其是对试图查找网页的浏览器而言)和URN,它们定义了某个东西的唯一名称。

我倾向于认为骨灰缸是类似的吉他。它们只是为事物提供独特名称的标准化方法。就像在使用公司名称的名称空间声明性中一样——它不像服务器上的某个资源与该行文本对应——它只是唯一地标识某个东西。

我也倾向于完全避免使用uri这个术语,并且只根据URL或urn来讨论问题,因为它会导致很多混乱。我们真正应该尝试为人们回答的问题不是语义,而是如何在遇到术语时确定它们之间是否存在任何实际差异,从而改变编程环境的方法。例如,如果有人在谈话中纠正我说,"哦,那不是一个URL,而是一个URI",我知道他们都有。如果有人说"我们正在使用一个URN定义资源",我很可能会理解我们只是唯一地命名它,而不是在服务器上定位它。

如果我离基地很远-请告诉我!


Identifier = Name + Location

抽象地说,每个URL(统一资源定位器)都是一个URI(统一资源标识符),但每个URI都不是一个URL。uri的另一个子类别是urn(统一资源名称),它是一个命名资源,但不指定如何定位它们,如mailto、news、isbn is uris。来源

enter image description here

瓮:

  • urn格式:urn:[namespace identifier]:[namespace specific string]
  • urn:和:代表自己。
  • 实例:
    • urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66
    • urn:issn:0167-6423
    • urn:国际标准书号:096139210x
    • Amazon资源名称(ARN)是唯一标识的AWS资源。
      • ARN格式:arn:partition:service:region:account-id:resource

网址:

  • URL格式:[scheme]://[Domain][Port]/[path]?[queryString]#[fragmentId]
  • ,,/,?代表自己。
  • 方案包括https、ftp、gopher、mailto、news、telnet、file、man、info、whatis、ldap…
  • 实例:
    • http://ipu服务器/路径?查询
    • ftp://ip_服务器/路径
    • mailto:电子邮件地址
    • 新闻:新闻组名称
    • telnet://ip_服务器/
    • file://ip_server/path_段
    • ldap://hostport/dn?属性?范围?过滤器?扩展

类比:要联系某人:驾驶(协议其他人短信息、电子邮件、电话)、地址(主机名其他电话号码、电子邮件ID)和人名(对象名和相对路径)。


uri=>http://en.wikipedia.org/wiki/uniform_resource_identifier

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

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


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

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

在这种情况下,com.mycompany.mynode将是一个唯一标识"myprefix"名称空间的URI,用于在我的XML文档中使用它的所有元素。这不是一个URL,因为它只用于标识,而不是定位本身的内容。


由于很难清楚地区分uri和url,据我所知,w3c不再区分uri和url(http://www.w3.org/addressing/)。


它们是一样的。URI是URL的泛化。最初,计划将URI分为URL(地址)和URN(名称),但是URL和URI之间几乎没有区别,HTTP URI被用作命名空间,即使它们实际上没有找到任何资源。


URI and URL

URI, URL, URN

如上图所示,这里有三个不同的组件。在讨论这些事情的时候,通常最好从源头着手,下面是TimBerners-Lee等人的练习。在里面RFC 3986:统一资源标识符(URI):通用语法:

A Uniform Resource Identifier (URI) is a compact sequence of
characters that identifies an abstract or physical resource.

A URI can be further classified as a locator, a name, or both. The
term"Uniform Resource Locator" (URL) refers to the subset of URIs
that, in addition to identifying a resource, provide a means of
locating the resource by describing its primary access mechanism
(e.g., its network"location").


uri是url和urn的超级类。维基百科有一篇关于它们的优秀文章,其中包含指向正确的RFC集的链接。


维基百科会提供你需要的所有信息。引用自http://en.wikipedia.org/wiki/uri:

A URL is a URI that, in addition to identifying a resource, provides means of acting upon or obtaining a representation of the resource by describing its primary access mechanism or network"location".


统一资源定位地址

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

尿嘧啶尿路感染

URI根据位置或名称或两者来标识资源。通常情况下,我们大多数人都使用定义资源位置的URI。事实上,一个URI可以通过名称和位置来标识一个资源,这在我看来导致了很多混乱。一个URI有两个专门化,即URL和URN。

URL和URI之间的差异

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


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

1
scheme://authority/path?query

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

Enter image description here

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

更多详情请参考:

Wikipedia


URI根据位置或名称或两者来标识资源。通常情况下,我们大多数人都使用定义资源位置的URI。事实上,一个URI可以通过名称和位置来标识一个资源,这在我看来导致了很多混乱。一个URI有两个专门化,即URL和URN。

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


尽管术语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

这可能是造成一些混乱的原因。


请参阅此文档。明确地,

a URL is a type of URI that identifies a resource via a representation of its primary access mechanism (e.g., its network"location"), rather than by some other attributes it may have.

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


我在想同样的事情,我发现了:http://docs.kohanapp.com/helpers/url。

使用url::current()方法可以看到一个清晰的示例。如果您有这个URL:http://example.com/kohana/index.php/welcome/home.html?query=string,那么使用url:current()会给您一个URI,根据文档,它是:welcome/home


看完这些帖子后,我发现一些非常相关的评论。简而言之,URL和URI定义之间的混淆部分基于哪个定义依赖于哪个定义,并且在软件开发中也非正式地使用了单词uri。

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

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

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


以下是我的简化:

urn:唯一的资源名,即"什么"(例如urn:issn:1234-5678)。这是独一无二的。同任何两个不同的文档一样,不能有相同的URN。有点像"UUID"

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

URI:可以是URN或URL。这个模糊定义是由于W3C和IETF产生的RFC3986。

多年来,URI的定义发生了变化,因此大多数人都会感到困惑。但是,您现在可以放心了,因为您可以将http://somesite.com/something作为URL或URI引用…A不管怎样,你都是对的(至少现在……)


URI的产生是因为需要以统一和一致的方式识别网络上的资源,以及其他互联网资源,例如电子邮箱。因此,可以引入一种新的小部件类型:uri来标识小部件资源,或者使用tel:uris来拥有Web链接,从而在调用时进行电话呼叫。

一些URI提供定位资源的信息(例如DNS主机名和该计算机上的路径),而一些则用作纯资源名。该URL是为资源定位器的标识符保留的,包括"http"URL,如http://stackoverflow.com,它标识主机上给定路径处的网页。另一个例子是"mailto"URL,例如mailto:[email protected],它标识给定地址的邮箱。

URN是用作纯资源名称而不是定位器的URI。例如,uri:mid:[email protected]是一个URN,用于在其"消息ID"字段中标识包含该消息的电子邮件。URI用于区分该消息和任何其他电子邮件消息。但它本身并没有在任何存储中提供消息的地址。


易于解释:

假设如下

uri是你的名字

URL是您的地址和您的姓名,以便与您通信。

  • 我叫洛约拉

    忠臣是URI

  • 我的地址是TN,金奈600001。

TN,Chennai 600 001,Loyola是URL

希望你能理解,

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

网址:http://www.google.com/fistpage.html

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

因此,uri是url的子集,反之亦然。


为了回答这个问题,我将依靠一个我改成另一个问题的答案。一个很好的URI示例是如何识别AmazonS3资源。让我们来看看:

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

我创建了一个缓存副本

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

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

即使stackoverflow允许我超链接到s3://protocolscheme,也不会对您定位资源有任何帮助。因为它标识了一个资源,所以图1是一个有效的URI。它也是一个有效的URN,因为Amazon要求bucket(它们对URI的authority部分的术语)在数据中心之间是唯一的。它有助于定位它,但它并不表示数据中心。因此,它不能作为URL工作。

那么,在这种情况下,uri、url和urn有什么不同呢?

  • 图1是URI
  • 图1是瓮
  • 图2是URI
  • 图2是URL
  • 图1的URL是http://www-example-com.s3-website-us-west-2.amazonaws.com。/
    • 另请访问http://www-example-com.s3.amazonaws.com/index.html
    • 但不是http://www-example-com.s3.amazonaws.com/(没有数据中心和文件名对于amazon s3来说太通用)

注:RFC3986将uri定义为scheme://authority/path?query#fragment


我发现:

统一资源标识符(URI)代表了一个重要的方面。您可以将uri/uri拆分为定位器(uniform resource locators-url),或者作为名称(uniform resource name urn),或者两者兼而有之。所以基本上,一个urn的功能类似于一个人的名字,而url描述了这个人的地址。总之,一个urn定义了一个项目的标识,而url提供了查找它的方法,最后封装这两个概念的是uri


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

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


答案模棱两可。在Java中经常使用这种方式:

统一资源定位器(URL)是用于标识Internet资源的术语,包括方案(http、https、ftp、news等)。例如,URI、URL和URN之间的区别是什么?

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

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


别忘了罐子。URI和URL都是URN。URL有一个位置:

1
2
3
4
URI: foo
URL: http://some.domain.com/foo
URL: http://some.domain.com:8080/foo
URL: ftp://some.domain.com/foo

它们都是骨灰缸。