URI、URL和URN有什么区别?

338

2
阅读以下内容(可能在阅读下面提供的答案后)会很有价值: http://www.w3.org/TR/uri-clarification/ 此外,下面的两个链接可以帮助澄清何时是URL VS URN。 永久URI方案:(我猜这是URL / URN命名空间,尽管URN在此列表中有自己的条目,导致我在这里提供下一个链接) http://www.iana.org/assignments/uri-schemes.html URN Namespaces: www.iana.org/assignments/urn-namespaces/urn-namespaces.xml - Lemmings19
4个回答

438

统一资源标识符(URI)是用于在互联网上标识名称或资源的一串字符。

URI通过位置、名称或两者同时来标识资源。 URI有两个特殊的专业术语,即URL和URN。

统一资源定位符(URL)是统一资源标识符(URI)的子集,指定标识资源的位置以及检索该资源的机制。 URL定义如何获取资源。 它不必是HTTP URL(http://),URL也可以以ftp://smb://开头,指定用于获取资源的协议。

统一资源名称(URN)是使用URN方案的统一资源标识符(URI),并且不意味着已经存在该标识的资源。 URN(名称)和URL(定位器)都是URI,一个特定的URI可能同时是名称和定位器。

此图表(source)可视化了URI、URN和URL之间的关系:

URI, URN, URL diagram

URN是互联网信息体系结构的一部分,由URN、URCs和URL组成。

bar.html不是URN。URN类似于人的名字,而URL类似于街道地址。URN定义了某物的身份,而URL提供了位置。本质上,URN与URL之间是“什么”与“在哪里”的关系。URN必须具有以下形式:<URN> ::= "urn:" <NID> ":" <NSS>其中<NID>是命名空间标识符,<NSS>是命名空间特定字符串。

换句话说:

  • URL是标识资源并提供访问方式的URI
  • URL是URI
  • URI不一定是URL

我认为唯一需要做的就是举一个不是URL的URI的例子,我们可以使用RFC3986中的例子:

URL: ftp://ftp.is.co.za/rfc/rfc1808.txt
URL: http://www.ietf.org/rfc/rfc2396.txt
URL: ldap://[2001:db8::7]/c=GB?objectClass?one
URL: mailto:John.Doe@example.com
URL: news:comp.infosystems.www.servers.unix
URL: telnet://192.0.2.16:80/
URN (not URL): urn:oasis:names:specification:docbook:dtd:xml:4.1.2
URN (not URL): tel:+1-816-555-1212 (disputed, see comments)

92
或许可以举个例子来澄清这一点:用于图书的ISBN号实际上是一个URN,它是给定图书的一个明确的标识符。但是ISBN号并不是URL,因为它不定义图书的位置。 - Stefan Gehrig
28
urn:isbn:0-486-27557-4是莎士比亚戏剧《罗密欧与朱丽叶》的一个特定版本的标识符,实际上是一个“URN”(因此是“URI”),但不是一个“URL”。 - Stefan Gehrig
17
顺便说一下:tel的例子并不完美,因为有人可能会认为它实际上是一个URL(即使它在常见的受互联网影响的领域并不是一个URL)。 - Stefan Gehrig
8
电话号码实际上是给定电话连接位置的描述。这个号码允许电话系统通过其唯一的电话号码找到接收者在全球电话网络中的位置,并适当地路由呼叫(美国为“+1”,密苏里州为“816”等)。 - Stefan Gehrig
1
javascript:alert(123);是URI还是URL? - Preco Plusb
显示剩余20条评论

159

以下是我对Prateek Joshi所做的精彩解释的总结:

理论:

  • URI(统一资源标识符)用于标识资源(文本文档、图像文件等)。
  • URL(统一资源定位符)是 URI 的子集,包括网络位置。
  • URN(统一资源名称)是一个包含给定空间内的名称但不包含位置的 URI 子集。

即:

enter image description here

例如:

enter image description here

此外,如果您还没有阅读过Roger Pate的回答,我建议您阅读一下。


9
因为使用图像可以更轻松/直观地了解情况。 - sitilge
11
正如接受的答案所述,“被标记为URN的东西在技术上并不是一个URN。一个URN必须符合以下形式:<URN> ::= "urn:" <NID> ":" <NSS>,其中<NID>是名称空间标识符,<NSS>是名称空间特定字符串。”虽然它在URL下面隐藏了一种类似于URN的功能。 - Alex Moore-Niemi
1
根据这个答案,存在既不是URL也不是URN的URI。但是对我来说看起来非常奇怪... - floatingpurr
1
@superciccio14,是的,我同意。我也想指出这一点。答案的作者能否给出一些既不是URL也不是URN的URI示例? - Varvara Kalinina
2
我认为这是错误的。URL和URN之间没有重叠。 - Johannes Overmann
@JohannesOvermann 我认为人们在 URN 的功能和正式 URN 格式之间混淆了。从概念上讲,URL 命名资源并定位它,实际上许多 URL 用作名称和定位器。但除了遵循 URN 格式的字符串之外,没有其他东西是真正的 URN,因此没有 URL 是真正的 URN。 - CognizantApe

101

统一资源定位符(URL)-- Uniform Resource Locator

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

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

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

统一资源名称(URN) -- Uniform Resource Name

通过名称标识资源。它总是以前缀urn: 开头,例如:

  • urn:isbn:0451450523 通过ISBN号码来标识书籍
  • urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66 全球唯一标识符
  • urn:publishing:book - 用于标识文档作为书籍类型的XML命名空间。

URNs可以标识思想和概念,不仅限于标识文档。当 URN 确实代表文档时,它可以通过 "解析器" 转换为 URL。然后可以从该 URL 下载文档。

统一资源标识符(URI)-- Uniform Resource Identifier

包括 URL、URN 和其他指示资源的方式。

一个既不是URL也不是URN的URI示例是数据URI,例如data:,Hello%20World。它不是URL或URN,因为URI包含数据,既不命名数据,也不告诉你如何在网络上定位它。

还有一种统一资源引用(URC),它指向文档的元数据而不是文档本身。URC的示例是指示查看网页源代码的指示器:view-source:http://example.com/。URC是另一种既不是URL也不是URN的URI类型。

常见问题解答

我听说不应再使用URL这个术语,为什么?

HTML的w3规范表示,锚标签的href可以包含URI,而不仅仅是URL。您应该能够放置一个URN,例如<a href="urn:isbn:0451450523">。然后,您的浏览器将会将该URN解析为URL并为您下载该书。

有没有浏览器实际上知道如何通过URN获取文档?

据我所知,没有,但现代Web浏览器确实实现了数据URI方案。

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

好问题。我看到很多网站都说这是真的。我没有找到任何既是URL又是URN的例子。我不明白如何可能,因为URN以urn:开头,这不是有效的网络协议。

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

不是。相对路径和绝对路径均为URL(和URI)。

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

不是。无论是否具有查询参数,URL 都是 URL(也是 URI)。

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

不是。无论是否具有片段标识符,URL 都是 URL(也是 URI)。

tel: URI 是 URL 还是 URN?

例如 tel:1-800-555-5555。它不以 urn: 开头,并且具有用于通过网络访问资源的协议。它必须是一个 URL。

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

是的。W3C 意识到这个问题存在很多混淆。他们发布了一个URI 澄清文档,表示现在可以交替使用 URL 和 URI。将 URI 严格分为不同类型,如 URL、URN 和 URC 等,已经没有用处了。


4
“tel:” 是一个 URI,因为它是一个标识符。请参阅RFC 3966。 它不是 URL,因为它不能帮助您定位网络上的资源。由于没有实际资源可供链接,因此这是不可能的。例如,“tel:”的锚点 href URI 将启动用于拨打该号码的任何程序。 - taco
1
你的浏览器会将URN解析成URL,并为你下载书籍。-- 不一定。例如,如果我输入一个ISBN URN,它应该带我去哪里?应该是一个购买实体或数字版本的书的地方吗?还是一个在线下载或阅读它的地方?URN仅仅标识了资源。URL允许你指定资源的位置。没有位置的已注册URN使用urn方案,而https://www.google.com/既是URL也是URN(它同时标识和定位Google Web搜索资源)。 - user539810
3
@taco 不确定为什么你说 tel: 不能帮助你定位资源。它明确告诉你,你可以通过传统的电话网络使用 PSTN 系统来访问它。与 http: 表示你可以使用纯文本 HTTP 和 DNS 服务访问它,https: 同样如此但是通过 TLS,而 mailto: 使用 SMTP。当你 点击 它或者你是否有能够处理呼叫或发送电子邮件的软件对于 URL 的语义完全无关。也许 tel: 的消费者是一个可以轻松处理它的自动呼叫系统。 - jbx
4
但是为什么你说只有通过超文本传输协议才能访问它呢?据我所知,一个URL并不决定这一点。例如,ftp://mailto://都是URL,但它们无法通过HTTP访问。只有http URL 可以。在“tel:”URL中的ID是电话号码,并且说它是“tel:”不仅限定了它,还指定了如何到达它(通过公共交换电话网拨打它)。我看不出“tel:”URL和例如“sip:”URL之间的区别。即使Microsoft也将其称为URL:https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms776001(v=vs.85) - jbx
1
@Number945 这与URI澄清文档一致,现在任何URI都可以称为URL。请参见此Venn图 - Stephen Ostermiller
显示剩余4条评论

3

根据维基百科,URI(统一资源标识符)是用于标识资源的字符序列。

URI是用于标识资源的字符序列。

URL(统一资源定位符)是一种暗示与资源交互机制的URI。例如https://www.google.com指定使用HTTP作为交互机制。并非所有URI都需要传达特定于交互的信息。

URN(统一资源名称)是具有urn作为方案的特定形式的URI。有关URI的一般形式的更多信息,请参见https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Syntax

IRI(国际资源标识符)是对URI定义的修订,允许我们在URI中使用国际字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接