文章目录
前言
在日常中我们打开浏览器访问网站时需要输入网址,如:
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通用组成部分
- 方案(Scheme):
方案是指用于访问资源的协议或方法,如 http、https、ftp、file 等。这是 URI 的开头部分,后面跟着一个冒号。 - 权威部分(Authority):
权威部分可选,它通常包含访问资源所需的主机名(域名或 IP 地址)和可选的端口号,格式为 用户名:密码@主机名[:端口号]。其中用户名和密码部分在实际使用中较少见,主要用于需要认证的情况。 - 路径(Path):
路径是资源在服务器上的位置,它是一个零或多个斜杠分隔的字符串。路径可以是相对路径或绝对路径。 - 查询(Query):
查询部分是可选的,用于传递附加信息,如参数。它以问号 ? 开始,后面跟随一个或多个键值对,键值对之间用等号 = 分隔,多个键值对之间用与号 & 分隔。 - 片段标识符(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>:命名空间内的具体名称,用于唯一标识特定的资源。
组成部分详解
- 命名空间(Namespace):
命名空间是一个字符串,用于定义 URN 的一部分语义,确保在该命名空间下的命名不会与其他命名空间下的命名发生冲突。命名空间的注册需要遵循 IANA 的规定,以确保其全球唯一性。 举例来说,isbn 是一个常用的命名空间,用于标识书籍的 ISBN 号;doi 是用于标识学术论文的 DOI 号。 - 名称(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 |