人们谈论 URL、URI 和 URN,就好像它们是不同的东西,但在肉眼看来它们是一样的。
它们之间有什么可区分的区别?
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
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是星际旅行的某种媒介:)
huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。
从 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 定义不匹配。
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
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,例如 。然后,您的浏览器会将该 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 的博客文章(链接在上面的评论中)忽略了这一点。
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
总结:一个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不这么认为,因为您可以在同一台计算机上拥有一个文件的副本,这将导致相同的哈希值,因此它不是唯一的。
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
这些是一些写得很好但冗长的答案。下面是 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,该问题已关闭,并且所有答案都已迁移到该问题。这个答案是从旧的封闭问题转移到这个受保护的问题的答案之一。即便如此,我这个答案还是具有误导性。我对它投了反对票——其他人也应该这样做,因为在它的新家中,这是错误的。作者应将其删除或撤消合并。
huntsbot.com – 高效赚钱,自由工作
首先让你的头脑摆脱混乱,把它简单化,你就会明白。
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
huntsbot.com – 高效赚钱,自由工作
对已经发布的答案的一个小补充,这是一个总结理论的维恩图(来自 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 子集的情况。误导,如果没有错的话。
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
身份 = 名称和位置
每个 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 个例子来举例说明一个定义,那么你的定义就不清楚了。
huntsbot.com – 高效赚钱,自由工作
这是我作为网络专业人士遇到的最令人困惑且可能不相关的主题之一。
据我了解,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,会有人真正关心吗?
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
URI => http://en.wikipedia.org/wiki/Uniform_Resource_Identifier
URL 是 URI 的子集(也包含 URN)。
基本上,URI 是一个通用标识符,其中 URL 指定位置,URN 指定名称。
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
URL 不是 URI 的真正子集。您可以使用字符 [ 和 ] 而不是 URI 来制作 vaid URL。
方括号在 URI 或 URL 中均无效。请参阅此问题,其中有许多对规范的引用:Are square brackets permitted in URLs?。当方括号出现在任何一个中时,它们都应该被编码。
huntsbot.com – 高效赚钱,自由工作
在考虑 URI 时,我喜欢使用的另一个示例是 XML 文档的 xmlns 属性:
some text
在这种情况下,com.mycompany.mynode 将是一个 URI,它为在我的 XML 文档中使用它的所有元素唯一标识“myPrefix”命名空间。这不是 URL,因为它仅用于识别,而不是用于定位某些东西本身。
原文链接:https://www.huntsbot.com/qa/ka7D/what-is-the-difference-between-a-uri-a-url-and-a-urn?lang=zh_CN
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会