URI、URL 和 URN 之间有什么区别?

http url uri urn rfc3986

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

它们之间有什么可区分的区别?

URL 比 URI 更具体。

Tor 网站管理员回答了这个问题:What is difference between URI and URL

迷你维恩图:( URIs ( URLs ) )

即使是那些试图回答这个问题的人,关于 URI 与 URL 似乎仍然存在很多混淆。看到不是 URI 的 URL 的实际示例、不是 URL 的 URI 的示例以及是 URL 和 URI 的示例,每个人都会受益。

凯西:“那是你的狗吗?”鲍勃:“称他为犬会更正确。”凯西:“不,他是条狗。你,先生,是个书呆子。”

C
Community

URI识别URL定位;然而,定位器也是标识符,所以每个 URL 也是一个 URI,但也有不是 URL 的 URI。

例子

罗杰·佩特

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

4914 West Bay Street, 拿骚, 巴哈马

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

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

流行的困惑

Wikipedia

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

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

URN

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

因为我目前与其他人共享此名称,所以它不是全球唯一的,也不适合作为 URN。不过,就算没有其他家族用过这个名字,我也是以我祖父的名字命名的,所以也不会随着时间的推移而独树一帜。即使不是这样,以我的名字命名我的后代的可能性也使得它不适合作为 URN。

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

URNs are different from URLs in this rigid uniqueness constraint这是否意味着 URL 不能唯一标识位置?

罗杰的回答提供了很好的实用建议。对于官方答案,我去找了 2001 年发布“URIs, URLs, and URNs: Clarifications and Recommendations”的 W3C。简而言之,W3C 表示当代观点是一切都是 URI。 URL 是一个非正式的概念,而不是一个正式的概念。这种混淆可以追溯到一种“经典观点”,它试图严格区分 URI 的类别(其中 URL 是一个类别)。

..a 统一资源定位器 (URL).. 指定已识别资源的可用位置以及检索它的机制。所以换句话说,没有“相对”URL这样的东西吗?

“earth128:Edward-de-Leau/6000000000569063853”(多个多元宇宙中唯一的我)是 URN、URL 还是 URI?

@edelwater:我想那是一个uri,因为它只识别你,但没有说明如何找到你,除非你的意思是earth128是星际旅行的某种媒介:)

S
SamB

RFC 3986

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

所以所有的 URL 都是 URI,所有的 URN 都是 URI——但是 URN 和 URL 是不同的,所以你不能说所有的 URI 都是 URL。

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

只有带有 urn: 方案的 URI 才是 URN。 URI 可以是经典 URL、URN 或只是不以“urn:”开头且不引用资源位置的 URI。

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

@AdamGent:RFC 3986 1.1.3:“URI 可以进一步分类为定位器、名称或两者。”因此,如果 URL 是一种特殊的 URI,则意味着每个 URL 都是一个 URI。不是吗?

@AdamGent:这听起来像是 Java 实现的怪癖,而不是规范。 java.net.URI doc 本身表示“每个 URL 都是一个 URI,抽象地说,但不是每个 URI 都是一个 URL”。 java.net.URL 做了一些奇怪的事情,比如通过将主机名解析为 IP 地址来检查 URL 的相等性(这似乎首先与 RFC 3986 sec 6 不一致,并破坏了 w 虚拟主机)。我认为这只是意味着 Java 标准库有一些不一致的类行为。

@JonSkeet 也许只需要区分标准与实现?例如,“正式地,根据 RFC,所有 URL 都是 URI。(RFC 摘录。)但现有实现可能与规范不完全匹配,可能是为了互操作性,并且可能使用根据 RFC 无效的 URL。而且因为这是一个复杂的领域,某些人和文档可能会使用 'URL' 来表示与 RFC 指定的东西不同的东西。”有点像大多数电子邮件验证例程与 RFC 定义不匹配。

C
Community

URI——统一资源标识符

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

URL——统一资源定位器

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

http://example.com/mypage.html

ftp://example.com/download.zip

邮箱:user@example.com

file:///home/user/file.txt

电话: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 就是一个例子。

经常问的问题

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

HTML 的 W3 规范规定 href of an anchor tag 可以包含一个 URI,而不仅仅是一个 URL。您应该可以输入一个 URN,例如 <a href="urn:isbn:0451450523">。然后,您的浏览器会将该 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: 开头),只要它具有“名称的属性”。也就是说:即使资源不再存在或变得不可用,它也是全局唯一且持久的。示例:HTML 文档类型中使用的 URI,例如 http://www.w3.org/TR/html4/strict.dtd。即使 w3.org 网站上的页面被删除,该 URI 仍将继续命名 HTML4 过渡文档类型。

https://i.stack.imgur.com/FbaKm.png

"C:\myfile" 是 URI、URL 还是 URN?或者没有。

除非您在文件路径上加上 file:// 前缀,否则文件路径不是 URL 或 URI。尽管浏览器通常会处理非 URL 格式的文件路径。 Mozilla publishes their test cases for file URLs

请参阅section 1.1 of the RFC——“统一性提供了几个好处。它允许在相同的上下文中使用不同类型的资源标识符,即使用于访问这些资源的机制可能不同。它允许跨不同的通用句法约定进行统一的语义解释资源标识符的类型..."

这个答案更容易理解。我可以清楚地看到 URL 和真实示例的图片瓮。并且任何人都可以阅读有关此内容的更多信息... danielmiessler.com/study/url-uri

感谢您明确说明 URI 仍然具有标准化的语法,尽管它比 URL 更灵活。 Daniel Miessler 的博客文章(链接在上面的评论中)忽略了这一点。

t
tschaible

总结:一个URI标识,一个URL标识和定位。

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

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

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

*统一资源名称

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

注意实际的 URN(查看它与 URL 的比较)会很有帮助:urn:isbn:0-486-27557-4

@Michael - 我的理解是 ISBN 0486275574 也为文本命名,因此有资格作为 URN。我选择了一种我认为读者会更熟悉的格式。

那么说文件的哈希(例如 SHA1)可能是该文件的 URN 是否有意义?

@johnsimer不这么认为,因为您可以在同一台计算机上拥有一个文件的副本,这将导致相同的哈希值,因此它不是唯一的。

A
Air

这些是一些写得很好但冗长的答案。下面是 CodeIgniter 的区别:

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

URI - /some/page.html

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

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

在 CodeIgniter 使用 URL 或 URI 这个词的每一个例子中,这就是他们所说的区别,尽管在 web 的宏大计划中,它并不是 100% 正确的。

这个答案可能过于简单,但请看他问题的背景。喋喋不休地谈论 XML 名称空间对他会更有帮助!

这个答案不仅是错误的,而且还具有误导性。这两个示例都是 URL。由于每个 URL 也是一个 URI,这意味着这两个示例都是 URI。为了演示 URI 和 URL 之间的区别,这是完全没有用的。

就 CodeIgniter 而言,这就是区别。在每种情况下,他们都使用 URL 或 URI 这个词,这就是他们所谈论的区别。因此,在网络的宏伟计划中,它不是 100% 正确,但在 OP 的问题范围内(CodeIgniter 的差异),这个答案是完全正确的。

这是错误的。 @JörgWMittag 主要是正确的。 URL 是 URI,它们是“完全限定的”;所以这个答案中的“URL”是两者。但 /some/page.html 不是 URI。它是一个“relative-ref”,是一种“URI-reference”。结合基本 URI 上下文,它可以被解析为一个 URI,但它本身并不是一个 URI。请参阅Section 4.1 of RFC 3986。 CodeIgniter 可能使用错误的术语,应该指出这一点; Q (如当前编辑的)不是特定于 CodeIgniter 的框架。

对于未来阅读这些评论并像我一样困惑的人:此答案未针对此问题发布。这个问题与 CodeIgniter 没有任何关系。有一个重复的问题特别提到了 CodeIgniter,该问题已关闭,并且所有答案都已迁移到该问题。这个答案是从旧的封闭问题转移到这个受保护的问题的答案之一。即便如此,我这个答案还是具有误导性。我对它投了反对票——其他人也应该这样做,因为在它的新家中,这是错误的。作者应将其删除或撤消合并。

E
Eugen Konkov

首先让你的头脑摆脱混乱,把它简单化,你就会明白。

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

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

URN => Uniform Resource Name 标识资源的名称

例子

我们有地址 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

G
Gustavo Mori

对已经发布的答案的一个小补充,这是一个总结理论的维恩图(来自 Prateek Joshi 的美丽 explanation):

https://i.stack.imgur.com/aRdPS.jpg

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

https://i.stack.imgur.com/2iD7U.jpg

我认为第二个插图是不正确的。根据规范 url.spec.whatwg.org/#url-writing,URL 必须写为相对 URL 或绝对 URL,可选地后跟“#”和片段。因此,#posts 片段标识符可能是 URL 的一部分

这两个插图相互矛盾。

url 不应该是 - thinkzarahatke.com 和 urn - author/amty.html#posts 吗?请向我解释一下,我很困惑。 :(

URN 应该是唯一的,这不是任何 URL 子集的情况。误导,如果没有错的话。

P
Premraj

身份 = 名称和位置

每个 URL(Uniform Resource Locator) 都是一个 URI(Uniform Resource Identifier),抽象地说,但每个 URI 都不是 URL。 URI还有一个子类是URN(Uniform Resource Name),它是一个命名资源,但没有指定如何定位他们,像mailto,news,ISBN是URIs。 Source

https://i.stack.imgur.com/SntfL.png

瓮:

URN 格式:urn:[命名空间标识符]:[命名空间特定字符串]

urn: 和 : 代表自己。

例子:

瓮:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66

骨灰盒:ISSN:0167-6423

骨灰盒:isbn:096139210x

Amazon 资源名称 (ARN) 是唯一标识 AWS 资源。 ARN 格式:arn:partition:service:region:account-id:resource

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://ip_server/path?query

ftp://ip_server/路径

邮寄地址:电子邮件地址

新闻:新闻组名称

telnet://ip_server/

文件://ip_server/path_segments

ldap://hostport/dn?attributes?scope?filter?extensions

类比:要联系一个人:驾驶(协议其他 SMS、电子邮件、电话)、地址(主机名其他电话号码、电子邮件 ID)和人名(具有相对路径的对象名称)。

小问题:[domain] 和 [port] 之间应该有一个冒号。即:example.com:1234

我想知道:如何检索与 mailto URL 关联的资源?

精确的空间位置既是 URN、URL 和 URI。您的答案不正确且晦涩难懂。如果你需要 20 个例子来举例说明一个定义,那么你的定义就不清楚了。

B
Brad Turek

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

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

有两个基本子集:

URL,定义位置(尤其是对于试图查找网页的浏览器)和

URN,它定义了某物的唯一名称。

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

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

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

不,我认为你是对的。 URI vs URL vs URL vs URI-ref 等的语义对大多数开发人员来说是无用的,只是因为它引发了毫无意义(非生产性,对决策制定无关紧要)的辩论。如果 Google API 使用 redirect_url 而不是 redirect_uri,会有人真正关心吗?

C
Craig Wilson

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

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

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

URL 不是 URI 的真正子集。您可以使用字符 [] 而不是 URI 来制作 vaid URL。

方括号在 URI 或 URL 中均无效。请参阅此问题,其中有许多对规范的引用:Are square brackets permitted in URLs?。当方括号出现在任何一个中时,它们都应该被编码。

D
D.C.

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

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

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

M
Mark Cidade

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

我以为情况正好相反。 URL 指的是一个具体的对象,而 URI 可以指的是那个或一个概念或其他任何东西。

URL定位资源,是标识资源的一种URI。

因为 URL 的定义随着时间的推移而发生了变化,所以它们是相同的。 URL 曾经是一种特定类型的 URI,但由于造成的混淆,W3C 将 URL 重新定义为 URI。

S
SFEley

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

也许我错过了那部分,但我在提供的链接中没有看到任何引用,它们消除了 URL 和 URI 之间的区别,只承认混淆并希望将错误引用 URL 的规范更新为引用 URI。

C
Community

https://i.stack.imgur.com/RKFwk.png

URI、URL、URN

如上图所示,这里有三个不同的组件在起作用。在讨论此类问题时,通常最好找到源头,所以这里是 Tim Berners-Lee 等人的摘录。人。在 RFC 3986: Uniform Resource Identifier (URI): Generic Syntax:

统一资源标识符 (URI) 是一个紧凑的字符序列,用于标识抽象或物理资源。 URI 可以进一步分类为定位符、名称或两者。术语“统一资源定位符”(URL) 指的是 URI 的子集,它除了标识资源外,还通过描述资源的主要访问机制(例如,其网络“位置”)来提供定位资源的方法。

A
André

URI 是 URL 和 URN 的超类。 Wikipedia 有一个关于它们的 fine article,其中包含指向正确 RFC 集的链接。

A
Amal Murali

网址

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

URI

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

URL和URI之间的区别

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

A
Amal Murali

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

URL 是一个 URI,它除了标识资源外,还通过描述资源的主要访问机制或网络“位置”来提供对资源进行操作或获取资源表示的方法。

S
Stephen Ostermiller

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

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

P
Peter Mortensen

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

scheme://authority/path?query

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

https://i.stack.imgur.com/HGWwt.png

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

更多详情请参考:

维基百科

这并没有教给我任何其他答案未涵盖的内容,这些答案至少有 6 年的历史,而且更完整,实际上试图解释如何区分 URI 和 URL。

重要的是要注意该图像是一个维恩图,尽管它看起来不像一个典型的图。我见过人们试图将其解释为“URL 的一部分”。此图并未说明 URI 以 URL 开头并以 URN 结尾。

G
Gumbo

尽管术语 URI 和 URL 是严格定义的,但许多术语将这些术语用于定义它们之外的其他事物。

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

REDIRECT_URL:/foo

REQUEST_URI: /foo

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

REDIRECT_SCRIPT_URL:/foo

REDIRECT_SCRIPT_URI:http://example.com/foo

SCRIPT_URL: /foo

SCRIPT_URI:http://example.com/foo

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

a
avpx

请参阅this document。具体来说,

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

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

C
Community

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

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

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

我相信当使用 URI 这个词来指代相对路径时,“URI-reference”实际上就是人们所想到的。因此,非正式地,软件系统使用 URI 来指代相对路径,使用 URL 来指代绝对地址。所以从这个意义上说,相对路径不再是 URL,而是 URI。

d
dpant

URI 源于需要以统一和连贯的方式识别 Web 上的资源和其他 Internet 资源(例如电子邮箱)。因此,可以引入一种新型的小部件:URI 来标识小部件资源或使用 tel: URI 来获得 Web 链接,从而在调用时进行电话呼叫。

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

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

j
jjolla

这是我的简化:

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

URL:“在哪里”可以找到它(例如 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 ...无论哪种方式,您都是正确的(至少目前是这样...)

B
Bruno Bronosky

为了回答这个问题,我将依靠 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 有何不同?

如图。 1 是一个 URI

如图。 1 是一个 URN

如图。 2是一个URI

如图。 2是一个网址

图的网址。 1 是 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 来说太通用了)

还有 http://www-example-com.s3.amazonaws.com/index.html

但不是 http://www-example-com.s3.amazonaws.com/(没有数据中心和文件名对于 Amazon S3 来说太通用了)

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

3
3 revs, 3 users 71%

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

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

这个答案是错误的。 URI 不是 URL 的一部分。相反,URL 是一种 URI。此外,此答案中的链接已损坏(我找不到合适的替代品。)

M
Mischa

最好的(技术)总结 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 的语法和语义的确切规范取决于使用的方案,该方案由第一个冒号之前的字符定义。 [RFC3986]

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

网址

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

红外线

国际化资源标识符的定义与 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 = ∅)

语义网问题的结论

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

l
loyola

容易解释:

让我们假设以下

URI 是你的名字

URL 是您的地址和您的姓名,以便与您交流。

我的名字是 Loyola Loyola 是 URI

我的地址是 TN,钦奈 600001。

TN, Chennai 600 001, Loyola 是 URL

希望你能理解,

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

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

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

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

这个答案具有误导性。引用自 Wikipedia “统一资源名称 (URN) 的功能类似于人名,而统一资源定位器 (URL) 类似于该人的街道地址。换句话说:URN 定义了项目的身份,而 URL 提供了一种查找方法它。”此外,URN 和 URL 都是 URI。

P
Peter Mortensen

我发现:

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

你还记得你在哪里找到这个的来源吗?是维基百科还是其他地方?如果是维基百科就好了!我并不是想在归因上遇到困难,而是因为您的回答 is different than this one,我问您,并且我认为您的回答是正确的。

C
Community

答案是模棱两可的。在 Java 中,它经常以这种方式使用:

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

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

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

这是绝对 URL 和相对 URL 之间的区别。它没有解释 URI 与 URL 和 URN 的关系。

实际上,这些都是准确的例子。在 Web 上,这通常是不同的。