一文搞懂 URI 和 URL


前言

在日常中我们打开浏览器访问网站时需要输入网址,如:

http://127.0.0.1:8080/web/index.html 

这一段字符串既是URL。

一、URI

  • URI:统一资源标识符 (Uniform Resource Identifier)

URI 是一种通用的标识符,用于唯一地标识网络上的资源。它可以用来命名资源,但不一定包含定位信息。也就是说,URI 可以是任何字符序列,只要它能够唯一地标识某个资源即可。

URI由几个部分组成,包括一个方案(scheme)、授权信息(authority,可选)、路径(path)、查询字符串(query,可选)和片段标识符(fragment,可选)。

例如:
mailto:someone@example.com(一个电子邮件地址)
ftp://ftp.example.com/pub/file.txt(FTP服务器上的文件)
urn:isbn:0-395-36341-6(国际标准书号)

URI通用组成部分

  1. 方案(Scheme):
    方案是指用于访问资源的协议或方法,如 http、https、ftp、file 等。这是 URI 的开头部分,后面跟着一个冒号。
  2. 权威部分(Authority):
    权威部分可选,它通常包含访问资源所需的主机名(域名或 IP 地址)和可选的端口号,格式为 用户名:密码@主机名[:端口号]。其中用户名和密码部分在实际使用中较少见,主要用于需要认证的情况。
  3. 路径(Path):
    路径是资源在服务器上的位置,它是一个零或多个斜杠分隔的字符串。路径可以是相对路径或绝对路径。
  4. 查询(Query):
    查询部分是可选的,用于传递附加信息,如参数。它以问号 ? 开始,后面跟随一个或多个键值对,键值对之间用等号 = 分隔,多个键值对之间用与号 & 分隔。
  5. 片段标识符(Fragment Identifier):
    有些地方也成Anchor(锚点),片段标识符是可选的,用于标识文档内部的位置或锚点。它以井号 # 开始,后面跟随一个标识符。

二、URL

  • URL:统一资源定位符 (Uniform Resource Locator)

URL 是 URI 的一个子集,它不仅标识了一个资源,还提供了足够的信息来定位该资源。也就是说,URL 包含了如何找到某个资源的信息,例如使用的通信协议(HTTP、HTTPS、FTP 等)、服务器地址、端口号、路径等。因此,URL 不仅标识了资源,而且还告诉用户如何访问该资源。

例如:
http://127.0.0.1:8080/xx/index.html

URL 的常见定义格式

在这里插入图片描述

方案(scheme)

URL 的第一部分是方案(也称协议),它表示浏览器必须使用的协议来请求资源(协议是计算机网络中交换或传输数据的一组方法)。常见的协议包括HTTP(超文本传输协议)、HTTPS(安全的HTTP)、FTP(文件传输协议)等。

权威(authority)

权威和方案之间用字符模式 : // 分隔。
权威包括域名(或ip)和端口(80),之间由冒号分隔。

主机名(Host)

主机名指定了提供资源的服务器的域名或IP地址。主机名通常是一个可读的域名,例如www.example.com,也可以是数字形式的IP地址。

例如:
www.example.com 是一个域名
127.0.0.1 是一个IP地址

端口号(Port)

端口号是一个可选部分,用于指定服务器上服务的端口。如果端口号未指定,系统将使用协议的默认端口。例如,HTTP默认端口是80,HTTPS默认端口是443。

例如:
https://www.example.com:8080 中的 :8080 是端口号

路径(Path)

路径指定了资源在服务器上的具体位置。它通常是一个目录和文件的路径。

例如:
在https://www.example.com/index.html中,/index.html 是路径,指向服务器上的一个文件。

查询参数(Query)

查询参数是URL中的一个可选部分,用于传递额外的信息或参数。它以 ? 开始,后面跟着键值对,多个键值对之间用 & 分隔。

例如:
https://www.example.com/search?q=openai&lang=en 中的 ?q=openai&lang=en 是查询参数

片段(Fragment)

也称锚点(anchor),是URL的可选部分,用于指向资源中的特定部分或位置。它以 # 开始。

例如:
https://www.example.com/index.html#section2 中的 #section2 是片段标识符

三、URN

  • URN: 统一资源名称 (Uniform Resource Name)

URN 是一种用于提供资源唯一标识符的 URI,用于提供资源的唯一标识符,但不提供资源的访问方法或位置信息。URN 的目的是提供一种持久的、唯一的命名机制,即使资源的位置发生变化,其名称仍然保持不变。

URN 通常出现在 URL 的末尾,以 # 符号开始,由一个命名空间标识符加上一个名字组成(唯一标识符)。

URN 的基本结构

urn:<namespace>:<name>

其中:

  • urn:这是所有 URN 的固定前缀,表明这是一个 URN 格式的标识符。
  • < namespace>:命名空间标识符,用于区分不同的命名体系。命名空间是由 IANA(Internet Assigned Numbers Authority)注册的,确保其唯一性和标准化。
  • < name>:命名空间内的具体名称,用于唯一标识特定的资源。

组成部分详解

  1. 命名空间(Namespace):
    命名空间是一个字符串,用于定义 URN 的一部分语义,确保在该命名空间下的命名不会与其他命名空间下的命名发生冲突。命名空间的注册需要遵循 IANA 的规定,以确保其全球唯一性。 举例来说,isbn 是一个常用的命名空间,用于标识书籍的 ISBN 号;doi 是用于标识学术论文的 DOI 号。
  2. 名称(Name):
    名称部分是命名空间内具体的标识符,用于唯一标识资源。名称的具体格式取决于命名空间的规定。

特点

  • 唯一性:URN 被设计为提供一个全局唯一的标识符,以确保无论资源的位置或状态如何改变,其标识符始终不变。
  • 持久性:URN 的目的是提供一个持久的命名机制,即使资源本身的位置、状态或其他属性发生了变化,URN 仍然可以保持一致。
  • 命名空间:URN 通常包含一个命名空间,该命名空间用于定义命名规则,确保 URN 的唯一性和持久性。命名空间由一个前缀加冒号(:)和后续的命名部分组成。

例如:
urn:isbn:045145055X 表示一本书的 ISBN 编号。
urn:oid:1.3.6.1.4.1.1466 表示一个 X.500 目录对象的 OID

以上例子中:

  • urn 表明这是一个 URN。
  • isbn 是命名空间前缀,它定义了这个 URN 的命名规则。
  • 045145055X 是具体的资源名称,这里是某本书的 ISBN 号。

用途

URN 主要用在需要唯一标识资源但不需要提供访问方法的情况下。
例如:

  • 书籍的 ISBN 号:用于标识书籍,而不关心书籍的存储位置或如何获取书籍。
  • 学术论文的 DOI 号:用于标识学术论文,而不提供具体的访问路径。
  • 组织内部的唯一标识符:在企业或组织内部,可以使用 URN 来标识特定的资产或资源

四、三者的区别和联系

URI 涵盖了 URL 和 URN。可以理解为URL是URI的一个子集,所有的URL都是URI,但不是所有的URI都是URL。
URL 是一种特殊的 URI,它包含了访问资源所需的所有信息。
URN 也是一种特殊的 URI,它仅用于命名资源而不包含访问信息。
可以理解为URN对网站进行了命名,URL提供了找到网站的方式。
在这里插入图片描述

五、URL编码

在使用GET请求发送请求时,会发现在URL中 空格 被转义为 %20 。这是因为URL需要在各种不同的系统和网络环境中传输,URL 中的某些字符会引起歧义,比如 URL 查询参数中包含了”&”或者”%”就会造成服务器解析错误;
因此,URL中只能包含ASCII字符集中的某些字符(否则就会造成 URL 解析错误),具体包括:

  • 字母(A-Z, a-z)
  • 数字(0-9)
  • 某些特殊字符,如 -、 _、 .、 !、 ~、 *、 '、 (、 )

在URL中具有特殊意义的字符

  • ; 用于分隔参数
  • / 用于分隔路径
  • ? 用于分隔查询字符串
  • & 用于分隔查询参数
  • = 用于分隔键值对
  • #用于分隔锚点

而空格在URL中是一个常见的字符,但空格在URL中会导致解析问题。
例如,一个包含空格的URL
http://qf.com/path with space 可能会被错误地解析为两个不同的URL:
http://qf.com/path 和 with。所以为了避免这种情况,空格需要被编码为%20。

下面列举常见的字符及其对应的编码

字符URL 编码字符URL 编码字符URL 编码字符URL 编码
空格%20+!%21"%22#%23
$%24%%25&%26'%27
(%28)%29*%2A+%2B
,%2C-%2D.%2E/%2F
:%3A;%3B<%3C=%3D
>%3E?%3F@%40[%5B
\%5C]%5D^%5E_%5F
`%60{%7B``%7C}
~%7E

参考文章
什么是URL
URL、URL 的结构以及 URI 与 URL 之间的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值