虽然大多数开发者知道什么是URL,但不是每个人都知道什么是URI,甚至更少知道URN。更不用说这些项目之间的关系并不总是很清楚。让我们用简单的语言来澄清它们的区别。
什么是URL?
我们每天都要和URL打交道。URL是一个首字母缩写,代表统一资源定位器。也许这个扩展名称听起来很奇怪,但你可以简单地称之为地址。地址这个词很好地解释了URL的作用。你可以把一个URL想象成你的家庭地址:它包含了找到你的家的所有信息。
同样,你可以把URL定义为一个字符串,表示互联网上某一资源的位置:一个网页、一张图片、一个邮箱等等。以下是URL的例子。
https://jwt.io
https://auth0.com/docs/get-started#learn-the-basics
https://identicons.dev/static/icons/mono/png/icon-access-token.png
mailto:yourfriend@somewhere.com
ftp://ftpserver.com/myfolder
URL和链接
虽然URL和链接这两个词通常可以互换使用,但从技术上讲它们不是同义词。一个URL是一个字符串,允许你找到一个资源。链接(超链接的简称)是一个HTML元素,使你能够在浏览器中从一个给定的URL加载资源。因此,一个链接依赖于一个URL,而一个URL可以在没有链接的情况下存在,但一个没有URL的链接是没有意义的(至少在其原来的意义上)。
URL的剖析
URL缩写的统一部分是关于这些定位器字符串的共同结构。下面的图片显示了这种标准结构。
一个URL由以下部分组成。
- 方案:在一个URL中,这是访问资源应该使用的协议。除了众所周知的HTTP和HTTPS,你还可以使用许多其他方案。
- 域名:这部分表示托管资源的服务器。它可以是一个域名或一个IP地址。
- 端口:它是用来发送访问资源的请求的协议端口。通常情况下,它被省略,意味着应使用默认的协议端口。
- 路径:这是在托管服务器上的资源的路径。
- 参数:这些是提供给托管服务器的可选额外信息。
- 锚:这部分代表资源内部的一个特定部分。它也被称为片段。
由域名和端口组成的组,如果存在的话,也被称为authority。方案和权限由字符串分隔 ://
.如果一个URL没有授权,方案和URL的其余部分只用冒号隔开。 :
.一个没有授权部分的URL的典型例子是代表一个电子邮件地址的URL,如 mailto:yourfriend@somewhere.com
.
Auth0配置和URLs
如果你要配置你的应用程序来使用Auth0,请确保你不要混淆文档、快速启动和教程中经常提到的两个常见概念:租户域和发行者URL。
租户域或简称域是一个字符串,形式为 YOUR-TENANT-NAME.auth0.com
其中 YOUR-TENANT-NAME
是你在Auth0创建账户时提供的名称。它代表服务器的域名,将处理你的应用程序和Auth0之间的所有互动。
发行者URL是你的租户的基本URL,是你用来处理认证和授权的ID和访问令牌的发行者。它有以下格式。 https://YOUR-TENANT-NAME.auth0.com
.
正如你所看到的,虽然发行者URL遵循URL格式,但租户域只是URL的域名部分。
什么是URI?
URI的缩写是统一资源标识符。简而言之,它是一个标识资源的字符串。从语法的角度来看,URI字符串大多遵循相同的格式......URL!😲
你可能会想,这怎么可能呢?那么,URL和URI是一回事吗?嗯,不是的。
URLs和URIs都遵循同样的规范。RFC 3986。然而,虽然URLs允许你定位一个资源,但URI只是识别一个资源。这意味着URI不一定是作为一个地址来获取资源。它只是作为一个标识符。
回到地址的例子,如果你说你住在你镇上唯一的黄色房子里,你并没有给出如何去那里的方向。然而,这一信息在你镇上的其他房子中标识了你的房子。
另一方面,一个URL是一个URI。除了使用相同的URI语法外,它还通过一个地址来识别一个资源。换句话说,URL是一个标识符,它允许你识别一个资源,同时,给你提供访问它的方向。
你的家庭地址不仅提供了找到它的方向。它还能识别它,使你不会把它与另一个地址混淆。
简而言之,URL是URI的一个子集。
URI的一个例子
现在你可能想知道,一个不是资源地址的URI有什么意义。🤔
一个不是URL的URI的典型例子是一个XML命名空间标识符。如果你曾经使用过XML,你可能已经发现了一些与下面类似的文件。
<?xml version = "1.0" encoding = "UTF-8"?>
<rec:recipe xmlns:recipe = "https://the-great-chef.com/languages/recipe">
<rec:title>Spaghetti carbonara</rec:title>
<rec:author>Anonymous</rec:author>
<rec:ingredients>
...
</rec:ingredients>
</cont:contact>
这个 https://the-great-chef.com/languages/recipe
字符串是一个URI,它标识了一个XML命名空间,即一组XML元素和属性的名称,允许你定义一个烹饪配方。顺便说一下,不要使用那个命名空间。我现在就完全发明了它!😄
虽然该URI的格式与URL相同,但它并不允许你访问网络上的任何资源。然而,使用这种格式可以让你减少名称空间的名称冲突。事实上,URI的域名并不打算作为托管该资源的服务器的名称。URI的域名利用现有的DNS注册程序来获得一个全球唯一的名称,而不需要另一个注册机构。换句话说,如果你是URI域名的所有者,就不会有冲突的风险。 the-great-chef.com
域名的所有者,在创建基于该域名的URI时就不会有冲突的风险。
URI在语义网中具有很大的相关性,因为它们被用来通过资源描述框架(RDF)来识别概念。
Auth0配置和URI
作为不是URL的URI的另一个例子,请考虑在Auth0注册一个API。
当向Auth0注册你的API时,你需要提供一个API标识符,也被称为受众。这个标识符只不过是一个URI:你的API的一个逻辑标识符。下图显示了一个URI格式的受众的例子。
Auth0不会试图向该URI发出任何请求。它只是用来将你的API与其他API区分开来。
什么是URN?
也许URN的缩写没有URL和URI那么流行,但它属于同一个家族。它是统一资源名称(Uniform Resource Name)的缩写,其范围是以永久的方式识别资源,甚至在该资源不再存在之后。
与URL不同的是,URN不提供任何关于定位资源的信息,而只是标识它,就像一个纯粹的URI。特别是,URN是一个URI,其方案是urn
,具有以下结构,如RFC 2141所描述的。
urn:<NAMESPACE-IDENTIFIER>:<NAMESPACE-SPECIFIC-STRING>
该 <NAMESPACE-IDENTIFIER>
占位符代表一个字符串,代表你要识别的资源类别。该 <NAMESPACE-SPECIFIC-STRING>
是资源的具体标识符,其格式取决于命名空间标识符。
以下是URN的例子。
urn:isbn:1234567890
urn:ISSN:0167-6423
urn:ietf:rfc:2648
这些URN识别不同类型的对象。例如。 urn:isbn:1234567890
通过ISBN系统识别一个出版物。 urn:ISSN:0167-6423
是通过ISSN系统识别一个出版物。 urn:ietf:rfc:2648
是一个由IETF发布的RFC。
你可能认为这种格式与你前面看到的URL和URI格式有很大的不同。实际上,它们有一个共同的语法定义,尽管这种差异有历史原因。
在Auth0上下文中,你使用URN来全局识别你的SAML实体。具体来说,你使用URN的形式是 urn:auth0:YOUR_TENANT:YOUR_CONNECTION_NAME
.查看这篇文章以了解更多关于SAML的信息,以及这篇文档以使用SAML与Auth0。
与URI不同,URN是由公共标准组织发布的标识符,可能涉及人类活动中任何需要标准标识符的东西,而不仅仅是计算机和软件系统。
免费试用最强大的认证平台。开始吧→
摘要
我希望现在你对URLs、URIs和URNs之间的关系有了更清晰的认识。为了总结这些重叠的概念之间的区别,请看这个信息图。