前言
我们在开发过程中会听到URI,这个和URL有什么区别呢?我们就来了解下其中的关系和区别。
我们先看一张图,大致了解其中的关系,再深入了解下:

1. 基本定义
1.1 URI
URI(Uniform Resource Identifier,统一资源标识符)是用于唯一标识互联网上资源的一个字符串。
URI通用格式:[scheme:][//authority][/path][?query][#fragment]
1.1.1 scheme:(协议)
- 定义了使用哪种协议、哪种方式来访问资源。例如:
https:- 安全的超文本传输协议 (用于网站)http:- 超文本传输协议ftp:- 文件传输协议 (用于下载文件)mailto:- 电子邮件协议 (用于打开邮件客户端)file:- 访问本地计算机上的文件data:- 直接在URI中嵌入数据(如Base64编码的图片)
1.1.2. //authority(授权部分)
指定了提供资源的主机(服务器)以及可能的访问凭证。表现为:[userinfo@]host[:port]
-
userinfo@ (用户信息):可选。格式为用户名:密码@。(例:ftp://user:pass@example.com) -
host (主机):必需 。通常是域名 (如www.example.com) 或 IP 地址 (如192.168.1.1)。 -
[:port] (端口):可选。指定连接到服务器上的特定网络端口。每个协议都有默认端口(HTTP->80, HTTPS->443, FTP->21),如果使用默认端口则可以省略。
1.1.3. /path(路径)
用于定位服务器上的特定资源。类似于操作系统中的文件路径,它指定了资源在服务器上的位置。表现为:/,例如:
/images/logo.png/products/category/phone/index.html/api/v1/users
1.1.4. ?query(查询字符串)
提供额外的参数给服务器,通常用于筛选、搜索或定制返回的资源。表现以问号 ?开头。包含一个或多个 key=value对,多个键值对之间用 &符号分隔。例如:
?page=2?category=electronics&sort=price&order=asc?q=search+keywords
1.1.5. #fragment(片段)
指向资源内部 的一个次级部分或锚点。它不会发送到服务器,纯粹用于客户端(浏览器)的页面内导航。表现为:以井号 #开头,如前端的锚点使用。例如:
#chapter1(跳转到HTML页面中id为chapter1的元素位置)#top(跳转到页面顶部)#disqus_thread(跳转到评论区)
因为URI它是一个广义概念,主要包含了两种表现形式:URL和URN。接下来了解下这两种。
1.2 URL
URL(Uniform Resource Locator,统一资源定位符)是我们最熟悉的概念,它不仅标识资源,还提供了定位和访问该资源的方法。
1.2.1 通用格式
URL通用格式:[scheme:][domain][port][/path][?query][#anchor]
协议://主机名:端口/路径?查询参数#片段
-
https://:协议(Scheme),表示使用HTTPS协议进行访问。 -
www.example.com:主机名(Host),表示资源所在的服务器域名。 -
:443:端口(Port),HTTPS默认端口是443,通常省略不写。 -
/products/index.html:路径(Path),表示资源在服务器上的具体位置。 -
?category=electronics&page=2:查询参数(Query),提供给服务器的额外参数,用于筛选或搜索。 -
#anchor:片段(Fragment),指向资源内部的某个锚点或部分。
1.2.2 案例说明
通俗案例讲解:例如你要寄一个快递
-
[scheme:] = 使用什么交通工具? (例如:航空邮件、EMS快递、平邮) -
[domain] = 收件人地址 (包括:国家、城市、街道、门牌号) -
[/path] = 收件人具体是谁? (例如:张三 收, 或 财务部 收) -
[?query] = 额外的具体要求 (例如:请前台代收, 请放在信箱里) -
[#anchor] = 快递内的某个部分 (例如:一封信中请看第二页第三段)
实际案例解析:使用一个复杂的URL说明
https://admin:secret@www.shop.com:8080/products/index.html?category=14&color=red#reviews
| 部分 | 值 | 解释 |
|---|---|---|
scheme |
https: |
使用HTTPS安全协议 |
domain |
//admin:secret@www.shop.com:8080 |
用户admin用密码secret登录到主机www.shop.com的8080端口 |
path |
/products/index.html |
服务器上products目录下的index.html文件 |
query |
?category=14&color=red |
给服务器的参数: category id是14,颜色是红色 |
anchor |
#reviews |
加载页面后,直接滚动到"用户评论"部分 |
1.2.3 URL的缺点
URL是和地址相关。如果资源被移动到了另一个服务器(地址变了),原来的URL就会失效(返回404错误)。那么有没有办法地址不变,尽管资源移动,通过不变的地址也可以定位到对应的资源呢?
答案是:URN,接下来我们看一下URN。
1.3 URN
URN(Uniform Resource Name,统一资源命名符)专注于为资源提供持久且位置无关的唯一名称。
他的作用 就是:为资源提供一个全局唯一、持久且与位置无关的名称。如何实现的呢?就是确保给资源一个"永久"的身份证号,无论这个资源被移动到哪个服务器上,它的名字(URN)都不会改变。它只回答一个问题:"这个资源是谁?",并且保证这个名字是唯一的和永久的。
1.3.1 通用格式
URN通用格式:[scheme:][namespace][namespace specific string]
表现为:urn:<命名空间>:<命名空间特定字符串>
1.3.2 案例
例如:urn:isbn:9780141036144(标识西游记这本书)
-
urn::固定的前缀,表明这是一个URN。 -
isbn :命名空间(Namespace),指定了后续字符串的格式和解析规则。例如,isbn表示国际标准书号。 -
9780141036144:命名空间特定字符串,在该命名空间内唯一标识某个资源。
1.3.3 如何使用
因为URN是和名称相关,位置无关 。名称是永久的,就需要额外的系统将其解析为当前的访问地址。就像图书管理系统,每本书有特定的编号,是需要额外的系统进行解析,才能使用。
所以要通过一URN解析服务将这个永久的名称(URN)转换为当前可用的地址(URL)来访问资源。就像一个永久身份证号(URN)可以通过户籍系统(解析服务)查到你的当前住址(URL)一样。
2. 三者的关系
总结对比表
| 特性 | URI | URL | URN |
|---|---|---|---|
| 全称 | 统一资源标识符 | 统一资源定位符 | 统一资源名称 |
| 核心作用 | 标识资源(我是谁?) | 定位并访问资源(我在哪?怎么找我?) | 命名资源(我的永久名字是什么?) |
| 包含信息 | 可能包含访问方式 | 总是包含访问协议和位置信息 | 不包含访问方式和位置信息 |
| 持久性 | 依赖具体类型 | 不稳定,资源移动则失效 | 稳定持久,与位置无关 |
| 例子 | https://..., mailto:..., urn:isbn:... |
https://www.example.com/page.html |
urn:isbn:9780141036144 |
| 类比 | 身份证 | 住址 | 身份证号码 |

3. 总结
最后总结一下,URI是一种概念,具体表现形式是URL和URN。而URL会因为资源的变化而失效,所以需要一种唯一的地址标识资源,不会因为资源的转移而失效,这就引出了URN。URN需要特定的系统解析,比较麻烦。所以我们常用的都是URL。
如有错误,请指正O^O!