人们谈论URL、URI和URN就好像它们是不同的东西,但在肉眼看来它们是一样的。
它们之间有什么可区分的区别?
URI的标识和URL的定位;但是,定位器也是标识符,因此每个 URL 也是一个 URI,但有些 URI 不是 URL。
这是我的名字,这是一个标识符。它就像一个 URI,但不能是一个 URL,因为它不会告诉你我的位置或如何联系我。在这种情况下,仅在美国,它也恰好识别出至少 5 个其他人。
这是一个定位器,它是该物理位置的标识符。它既像 URL 又像 URI(因为所有 URL 都是 URI),并且还间接地将我标识为“...的居民”。在这种情况下,它唯一地标识了我,但如果我有室友,情况就会改变。
我说“喜欢”是因为这些示例不遵循所需的语法。
来自维基百科:
在计算中,统一资源定位符 (URL) 是统一资源标识符 (URI) 的子集,它指定已识别资源的可用位置以及检索它的机制。在流行用法以及许多技术文档和口头讨论中,它经常被错误地用作 URI 的同义词,... [强调我的]
由于这种常见的混淆,许多产品和文档错误地使用了一个术语而不是另一个,分配了它们自己的区别,或者同义地使用它们。
我的名字,Roger Pate,可能类似于URN(统一资源名称),除了那些更受监管并且旨在在空间和时间上都是唯一的。
因为我目前与其他人共享此名称,所以它不是全球唯一的,也不适合作为 URN。不过,就算没有其他家族用过这个名字,我也是以我祖父的名字命名的,所以也不会随着时间的推移而独树一帜。即使不是这样,以我的名字命名我的后代的可能性也使得它不适合作为 URN。
在这种严格的唯一性约束中,URN 与 URL 不同,尽管它们都共享 URI 的语法。
来自RFC 3986:
URI 可以进一步分类为定位符、名称或两者。术语“统一资源定位符”(URL) 指的是 URI 的子集,它除了标识资源之外,还通过描述资源的主要访问机制(例如,其网络“位置”)来提供定位资源的方法。术语“统一资源名称”(URN)在历史上一直用于指代“urn”方案[RFC2141]下的两个 URI ,即使资源不再存在或变得不可用,它们也需要保持全局唯一和持久性,并且到具有名称属性的任何其他 URI。
所以所有的 URL 都是 URI,所有的 URN 都是 URI——但是 URN 和 URL 是不同的,所以你不能说所有的 URI 都是 URL。
如果您还没有阅读Roger Pate 的回答,我建议您也这样做。
URI 是一种使用数字、字母和符号组成的短字符串来识别文档的标准。它们由RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax定义。URL、URN 和 URC 都是URI类型。
包含有关如何从其位置获取资源的信息。例如:
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
(相对 URL,仅在另一个 URL 的上下文中有用)URL 总是以协议 ( http
) 开头,通常包含诸如网络主机名 ( example.com
) 和文档路径 ( /foo/mypage.html
) 之类的信息。URL 可能有查询参数和片段标识符。
通过唯一且持久的名称标识资源,但不一定告诉您如何在 Internet 上找到它。它通常以前缀开头,urn:
例如:
urn:isbn:0451450523
通过 ISBN 号识别一本书。urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66
全局唯一标识符urn:publishing:book
- 将文档标识为书籍类型的 XML 命名空间。URN 可以识别想法和概念。它们不限于识别文件。当 URN 确实表示文档时,它可以通过“解析器”转换为 URL。然后可以从 URL 下载该文档。
指向有关文档的元数据而不是文档本身。URC 的一个示例是指向页面的 HTML 源代码,例如:view-source:http://example.com/
数据可以直接放入 URI 中,而不是在 Internet 上定位或命名。一个例子是data:,Hello%20World
。
HTML 的 W3 规范说href
锚标记的可以包含一个 URI,而不仅仅是一个 URL。您应该能够放入一个 URN,例如<a href="urn:isbn:0451450523">
. 然后,您的浏览器会将该 URN 解析为 URL 并为您下载该书。
据我所知,现代网络浏览器确实实现了数据 URI 方案。
不,相对 URL 和绝对 URL 都是 URL(和 URI)。
否。带有和不带有查询参数的 URL 都是 URL(和 URI)。
不。带有和不带有片段标识符的 URL 都是 URL(和 URI)。
不,URL 被定义为 URI 的严格子集。如果解析器允许 URL 中的字符但 URI 中不允许,则解析器中存在错误。规范详细说明了 URL 和 URI 的哪些部分允许使用哪些字符。某些字符可能只允许在 URL 的某些部分中使用,但字符本身并不是 URL 和 URI 之间的区别。
是的。W3C 意识到对此有很多困惑。他们发布了一份URI 澄清文件,指出现在可以互换使用术语 URL 和 URI(表示 URI)。将 URI 严格划分为不同类型(如 URL、URN 和 URC)已不再有用。
URN 的定义现在比我上面所说的要宽松。最新的关于 URI 的RFC说,任何 URI 现在都可以是 URN(不管它是否以 开头urn:
),只要它具有“名称的属性”。也就是说:即使资源不再存在或变得不可用,它也是全局唯一且持久的。一个例子:HTML 文档类型中使用的 URI,例如http://www.w3.org/TR/html4/strict.dtd
. 即使 w3.org 网站上的页面被删除,该 URI 仍将继续命名 HTML4 过渡文档类型。
这些是一些写得很好但冗长的答案。就 CodeIgniter 而言,这是不同的:
网址- http://example.com/some/page.html
URI - /some/page.html
简而言之,URL 是在任何地方识别任何资源的完整方式,并且可以具有不同的协议,如 FTP、HTTP、SCP 等。
URI 是当前域上的资源,因此需要的信息较少。
在 CodeIgniter 使用 URL 或 URI 这个词的每一个例子中,这就是他们所说的区别,尽管在 web 的宏大计划中,它并不是 100% 正确的。
首先让你的头脑摆脱混乱,把它简单化,你就会明白。
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
对已经发布的答案的一个小补充,这是一个总结理论的维恩图(来自 Prateek Joshi 的美丽解释):
还有一个例子(也来自 Prateek 的网站):
身份 = 名称和位置
每个 URL( Uniform Resource L ocator ) 抽象地说都是一个 URI(Uniform Resource I dentifier ) ,但是每个URI都不是一个 URL。URI的另一个子类是URN(统一资源名称),它是一个命名资源,但没有指定如何定位它们,如mailto,news,ISBN是URI。 来源
瓮:
urn:[namespace identifier]:[namespace specific string]
arn:partition:service:region:account-id:resource
网址:
[scheme]://[Domain][Port]/[path]?[queryString]#[fragmentId]
类比:
要联系一个人:驾驶(协议其他 SMS、电子邮件、电话)、地址(主机名其他电话号码、电子邮件 ID)和人名(具有相对路径的对象名称)。
这是我作为网络专业人士遇到的最令人困惑且可能不相关的主题之一。
据我了解,URI 是对某事物的描述,遵循公认的格式,可以定义某事物的唯一名称(标识)或其位置。
有两个基本子集:
我倾向于认为 URN 类似于 GUID。它们只是为事物提供唯一名称的标准化方法。就像在使用公司名称的命名空间声明中一样——它并不像在服务器上的某处对应于该文本行的资源——它只是唯一地标识某物。
我也倾向于完全避免使用 URI 这个术语,并且只在适当的时候使用 URL 或 URN 来讨论事物,因为它会引起很多混乱。我们真正应该尝试为人们回答的问题与其说是语义,不如说是在遇到这些术语时如何识别它们是否存在任何实际差异,从而改变编程情况的方法。例如,如果有人在对话中纠正我并说,“哦,那不是 URL,它是 URI”,我知道他们已经满了。如果有人说,“我们使用 URN 来定义资源”,我更可能理解我们只是唯一地命名它,而不是在服务器上定位它。
如果我离基地很远,请告诉我!
URI => http://en.wikipedia.org/wiki/Uniform_Resource_Identifier
URL 是 URI 的子集(也包含 URN)。
基本上,URI 是一个通用标识符,其中 URL 指定位置,URN 指定名称。
在考虑 URI 时,我喜欢使用的另一个示例是 XML 文档的 xmlns 属性:
<rootElement xmlns:myPrefix="com.mycompany.mynode">
<myPrefix:aNode>some text</myPrefix:aNode>
</rootElement>
在这种情况下,com.mycompany.mynode 将是一个 URI,它为在我的 XML 文档中使用它的所有元素唯一标识“myPrefix”命名空间。这不是 URL,因为它仅用于识别,而不是用于定位某些东西本身。
他们是同一个东西。URI 是 URL 的概括。最初,URI 计划分为 URL(地址)和 URN(名称),但是 URL 和 URI 之间几乎没有区别,并且 http URI 被用作命名空间,即使它们实际上并没有找到任何资源。
由于难以清楚地区分 URI 和 URL,据我所知,W3C 不再区分 URI 和 URL ( http://www.w3.org/Addressing/ )。
URI、URL、URN
如上图所示,这里有三个不同的组件在起作用。在讨论此类问题时,通常最好找到源头,所以这里是 Tim Berners-Lee 等人的摘录。人。在 RFC 3986 中:统一资源标识符 (URI):通用语法:
统一资源标识符 (URI) 是一个紧凑的字符序列,用于标识抽象或物理资源。
URI 可以进一步分类为定位符、名称或两者。术语“统一资源定位符”(URL) 指的是 URI 的子集,它除了标识资源外,还通过描述资源的主要访问机制(例如,其网络“位置”)来提供定位资源的方法。
URI 是 URL 和 URN 的超类。Wikipedia 有一篇关于它们的好文章,其中包含指向正确 RFC 集的链接。
维基百科将在此处提供您需要的所有信息。引用http://en.wikipedia.org/wiki/URI:
URL 是一个 URI,它除了标识资源外,还通过描述资源的主要访问机制或网络“位置”来提供对资源进行操作或获取资源表示的方法。
网址
URL 是 URI 的一种特殊形式,它定义了特定资源的网络位置。与 URN 不同,URL 定义了如何获取资源。我们每天都以 etc 的形式使用 URL http://example.com
。但是 URL 不一定是 HTTP URL,它也可以是ftp://example.com
etc。
URI
URI 通过位置或名称或两者来标识资源。大多数情况下,我们大多数人使用定义资源位置的 URI。在我看来,URI 可以通过名称和位置来识别资源这一事实导致了很多混乱。URI 有两个特化,称为 URL 和 URN。
URL和URI之间的区别
URI 是某些资源的标识符,但 URL 为您提供获取该资源的特定信息。URI 是一个 URL,正如一位评论者指出的那样,现在在描述应用程序时使用 URL 被认为是不正确的。通常,如果 URL 描述了资源的位置和名称,则使用的术语是 URI。由于我们大多数人每天都会遇到这种情况,因此 URI 是正确的术语。
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_URI
:http://example.com/foo
SCRIPT_URL
:/foo
SCRIPT_URI
:http://example.com/foo
这可能是一些混乱的原因。
通读帖子后,我发现了一些非常相关的评论。简而言之,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。
URI 源于需要以统一和连贯的方式识别 Web 上的资源和其他 Internet 资源(例如电子邮箱)。因此,可以引入一种新型的小部件: URI 来标识小部件资源或使用tel: URI 来获得 Web 链接,从而在调用时进行电话呼叫。
一些 URI 提供定位资源的信息(例如 DNS 主机名和该机器上的路径),而另一些则用作纯资源名称。该URL保留用于作为资源定位器的标识符,包括诸如http://stackoverflow.com之类的“http”URL ,它标识主机上给定路径处的网页。另一个示例是“mailto” URL,例如mailto:fred@mail.org,它标识给定地址的邮箱。
URN是用作纯资源名称而不是定位器的 URI。例如,URI:mid:0E4FC272-5C02-11D9-B115-000A95B55BC8@stackoverflow.com是一个 URN,用于标识在其“消息 ID”字段中包含它的电子邮件。URI 用于将该消息与任何其他电子邮件消息区分开来。但它本身并不提供消息在任何商店中的地址。
这是我的简化:
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 引用……无论哪种方式,您都是正确的(至少目前是这样…… .)
为了回答这个问题,我将依靠我修改为另一个问题的答案。URI 的一个很好的例子是您如何识别 Amazon S3 资源。让我们来:
s3://www-example-com/index.html
[无花果。1]
我创建的缓存副本
http://www.example.com/index.html
[无花果。2]
在亚马逊的S3-US-West-2数据中心。
即使 StackOverflow 允许我超链接到s3://
协议方案,它也不会对您定位资源有任何好处。因为它标识一个Resource,图。1是一个有效的 URI。它也是一个有效的 URN,因为 Amazon 要求存储桶(他们authority
对 URI 部分的术语)在数据中心之间是唯一的。它有助于定位它,但它并不表示数据中心。因此它不能用作 URL。
那么,在这种情况下,URI、URL 和 URN 有何不同?
注意: RFC 3986 将 URI 定义为scheme://authority/path?query#fragment
我想知道同样的事情,我发现了这个:http ://docs.kohanaphp.com/helpers/url 。
url::current()
您可以使用该方法看到一个清晰的示例。如果您有此URL:http://example.com/kohana/index.php/welcome/home.html?query=string
然后 usingurl:current()
为您提供URI,根据文档,该 URI 是:welcome/home
最好的(技术)总结imo是这个
IRI、URI、URL、URN 以及它们与Jan Martin Keil 的区别:
每个与语义网打交道的人都会反复遇到IRI、URI、URL和URN等术语。然而,我经常观察到它们的确切含义存在一些混淆。当然,其他人也注意到了这一点(参见例如 RFC3305 或在 Google 上搜索)。老实说,我什至一开始自己也很困惑。但实际上问题并没有那么复杂。让我们看一下上述术语的定义,看看有什么区别:
统一资源标识符是标识抽象或物理资源的紧凑字符序列。字符集仅限于 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 命名的现有实体。但是,我们应该避免新创建这种标识符。
容易解释:
让我们假设以下
URI 是你的名字
URL 是您的地址和您的姓名,以便与您交流。
我叫洛约拉
洛约拉是 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 的子集,但反之则不然。
我发现:
一个统一的资源标识符 (URI) 代表了一个大图景。您可以拆分 URI / URI 可以分类为定位器(统一资源定位器 - URL)或名称(统一资源名称 - URN),或两者兼而有之。所以基本上,URN 的功能就像一个人的名字,而 URL 描述了那个人的地址。长话短说,一个URN定义了一个项目的身份,而URL提供了定义找到它的方法,最后封装这两个概念就是URI
答案是模棱两可的。在 Java 中,它经常以这种方式使用:
统一资源定位符 (URL) 是用于标识 Internet 资源的术语,包括方案(http、https、ftp、新闻等)。例如URI、URL 和 URN 之间有什么区别?
统一资源标识符 (URI) 用于标识 Web 服务器中的单个文档:例如 /questions/176264/whats-the-difference-between-a-uri-and-a-url
在 Java servlet 中,URI 经常引用没有 Web 应用程序上下文的文档。
不要忘记 URN。URI 和 URL 都是 URN。URL 有一个位置:
URI: foo
URL: http://some.domain.com/foo
URL: http://some.domain.com:8080/foo
URL: ftp://some.domain.com/foo
他们都是URN。