09 一个完整的URL
URI — 统一资源标识符,本质上是一个字符串,作用是唯一地标记资源的位置或者名字
URL — 统一资源定位符
-
总结
1、URI 是用来唯一标记服务器上资源的一个字符串,通常也称为 URL
2、URI 通常由 scheme、host:port、path 和 query 四个部分组成,有的可以省略
scheme - 方案名/协议名,表示资源应该使用 哪种协议 来访问
host:port - 表示资源所在的 主机名和端口号
path - 标记资源所在的位置
query - 表示对资源附加的额外要求
3、在
URI
里对@&/
等特殊字符和汉字必须要做编码,否则服务器收到HTTP
报文后会无法正确处理
URI 的格式
URI 最常用的形式如下图,由scheme、host:port、path、query
四个部分组成,但有的部分可以视情况省略:
-
scheme 方案名/协议名
表示资源应该使用哪种协议来访问,例如
http
、https
,以及不常见的ftp
、ldap
、file
、news
等 -
在
scheme
之后,必须是三个特定的字符://
作用是分离
scheme
和后面部分 -
在
://
之后,是被称为authority
的部分表示资源所在的主机名,通常的形式是
host:port
,即主机名加端口号- 主机名可以是
IP
地址或者域名的形式,必须要有 - 端口号有时可以省略,浏览器等客户端会依据
scheme
使用默认的端口号
- 主机名可以是
-
path
- 标记资源所在位置-
URI
的path
部分必须以/
开始,也就是必须包含/
-
举个例子
客户端和服务器看到的 URI 是不一样的
-
现象:
客户端看到的必须是完整的 URI,使用特定的协议去连接特定的主机
而服务器看到的只是报文请求行里被删除了协议名和主机名的
URI
-
原因:协议名和主机名已经分别出现在了请求行的版本号和请求头的
Host
字段里,没有必要再重复
-
-
-
query
- 对资源附加的额外要求 用一个?
开始,但不包含?
,表示对资源附加的额外要求 格式:多个key=value
的字符串,这些 KV 值用字符&
连接
URI 的完整格式
真正完整的格式如下,可以注意到多出两部分:
1、协议名之后、主机名之前的身份信息:表示登录主机时的用户名和密码,但现在已经不推荐使用这种形式了,严重的安全隐患
2、查询参数后的片段标识符 #fragment
:是 URI
所定位的资源内部的一个“锚点”或者说是“标签”,浏览器可以在获取资源后直接跳转到它指示的位置 –> 但仅能由浏览器这样的客户端使用,服务器是看不到的
URI 的编码
如果要在 URI 里使用英语以外的汉语、日语等其他语言?
URI引入了编码机制,对于ASCII码以外的字符集和特殊字符做一个特殊的操作 — 转义
-
转义原则
直接把非 ASCII 码或特殊字符转换成十六进制字节值,然后前面再加上一个
%