URI与URL区别:资源ID和地址差异
核心答案(一句话概括)
URI(统一资源标识符)是资源的“身份证”,用于唯一标识一个资源。
URL(统一资源定位符)是资源的“家庭住址”,用于告诉我们去哪裡找到这个资源。
所有 URL 都是 URI,但并非所有 URI 都是 URL。 URL 是 URI 的一个子集。
详细解释
为了更好地理解,我们来看一下它们的关系和定义,这可以通过一个维恩图来清晰地展示:
graph LRA[URI<br>统一资源标识符] --> B{是标识符还是定位符?}B -->|是定位符| C[URL<br>统一资源定位符]B -->|是标识符| D[URN<br>统一资源名称]C --> E[例如:<br>https://www.example.com/index.html]D --> F[例如:<br>urn:isbn:9780141036144<br>(一本书的唯一标识)]
上图展示了 URI 包含两大子集:URL 和 URN。
- URI (Uniform Resource Identifier):是一个更广泛的概念,指任何用于标识某一互联网资源的字符串。
- URL (Uniform Resource Locator):它不仅标识了资源,还提供了定位该资源的方法(即访问机制和位置)。我们日常生活中在浏览器地址栏里输入的就是 URL。
- URN (Uniform Resource Name):它旨在作为资源的唯一且持久的名称,而不指定其位置。例如,一本书的 ISBN 号就是一个 URN,无论这本书在世界的哪个角落,它的 ISBN 号都是不变的。URN 目前应用还不广泛。
由于 URN 并不常用,而现在绝大多数 URI 实际上都是 URL,所以人们常常将这两个术语混用。但在技术讨论中,理解它们的区别是很重要的。
举例说明
让我们用一个例子来具体化这些概念:
假设有一本书:
- URI (标识符):就像是这本书的 ISBN 号码
9780141036144
。这个号码在全球范围内唯一地标识了这本书(乔治·奥威尔的《1984》),但它没有告诉你这本书放在哪里。 - URL (定位符):就像是这本书在图书馆中的索书号
"Fiction Section, Shelf 5A, Row 3"
。它明确地告诉了你找到这本书的具体位置和方法。 - Web 上的例子:
- URI示例:
https://www.example.com/blog/articles/123
- URL示例:
https://www.example.com/blog/articles/123
- 分析:这个字符串既唯一地标识了那篇 ID 为 123 的文章(所以它是 URI),又提供了如何获取它的具体方案(
https
)、位置(www.example.com
)和路径(/blog/articles/123
)(所以它也是 URL)。
- URI示例:
另一个只有 URI 不是 URL 的例子:
urn:isbn:9780141036144
- 这是一个 URN,它唯一标识了《1984》这本书,但它没有提供任何如何在线或离线找到这本书的方法。因此,它是 URI,但不是 URL。
对比表格
特性 | URI (统一资源标识符) | URL (统一资源定位符) |
---|---|---|
目的 | 标识资源 | 定位资源 |
含义 | 资源的身份 | 资源的地址 |
范围 | 更广泛的概念 | URI 的一个子集 |
是否包含访问方式 | 不一定 | 总是包含(如 http, ftp, https) |
例子 | urn:isbn:0451450523 (一本书的URN) | https://www.example.com/index.html |
https://www.example.com/users/5 (也是URL) | ftp://example.com/files/document.pdf | |
类比 | 一个人的 名字 (标识他是谁) | 一个人的 家庭住址 (告诉你在哪找到他) |
技术上的细微差别
- URI 语法:一个完整的 URI 通常包括以下部分:
scheme:[//authority]path[?query][#fragment]
scheme
:方案,如http
,https
,ftp
,mailto
,urn
。authority
:通常包含user:password@host:port
。path
:路径,指向特定资源。query
:查询参数,用于动态内容。fragment
:片段,通常指向资源内部的某个部分。
- 一个 URL 必须 包含一个用于访问资源的 方案(scheme) 和 位置(authority/path)。
- 一个 URN 的方案是
urn
,并且遵循特定的命名空间(如isbn
,issn
等)。
总结
- 当你关心的是如何找到一个资源(需要协议、地址、路径)时,你谈论的是 URL。
- 当你只是需要唯一地指代一个资源,而不关心如何访问它时,你谈论的是 URI。
- 在 Web 开发和日常用语中,由于 URN 不常见,我们遇到的绝大多数 URI 实际上都是 URL,所以混用很普遍。但在需要精确表达的场合(如技术规范、API 设计),理解它们的区别至关重要。