【计算机原理】深入解析 HTTP 中的 URL 格式、结构和 URL encode 转义与 URL decode 逆转义原理

【计算机原理】深入解析 HTTP 中的 URL 格式、结构和 URL encode 转义与 URL decode 逆转义原理

网络原理— HTTP 请求(Request)

认识URL

1. URL 基本格式

平时我们俗称的 “网址” 其实就是说的 URL (Uniform Resource Locator 统一资源定位符);

互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置,以及浏览器应该怎么处理它;

URL的详细规则由因特网标准RFC1738进行了约定.(因特网标准 RFC1738)

一个具体的URL:

https://v.bitedu.vip/personInf/student?userId=10000&classId=100

可以看到,在这个URL中有些信息被省略了;

https:

协议方案名;常见的有http和https,也有其他的类型;(例如访问mysql时用的jdbc:mysql)

user:pass:

登陆信息;现在的网站进行身份认证,一般不再通过URL进行了,一般都会省略

v.bitedu.vip:

服务器地址(IP地址),用于定位一个主机;此处是一个"域名",域名会通过 DNS 系统解析成一个具体的IP地址;(通过ping命令可以看到,v.bitedu.vip 的真实IP地址为118.24.113.28)

端口号:

每个应用程序在使用网络时,都会关联一个空闲的端口号;通过 IP 定位一台主机,通过端口号区分主机上使用网络的多个应用程序;当端口号省略的时候,浏览器会根据协议类型自动决定使用哪个端口;例如 http 协议默认使用80端口,https协议默认使用443端口;

回忆五元组:源端口,源 ip,目的端口,目的 ip,协议类型;

http 协议默认使用80端口,https协议默认使用443端口,站在客户端的角度,两种协议访问的端口是远端服务器的端口(目的端口),不是浏览器自身的客户端端口(源端口);

/personInf/student:

带层次结构的文件路径,每一层都是一个目录;

userId=10000&classId=100:

查询字符串(query string),本质是一个键值对结构;键值对之间使用&分隔;键和值之间使用=分隔.

片段标识:

片段标识主要用于页面内跳转.

例如Vue官方文档:

https://cn.vuejs.org/v2/guide/#%E8%B5%B7%E6%AD%A5

通过不同的片段标识跳转到文档的不同章节

2. 使用 ping 命令查看域名对应的IP地址

在开始菜单中输入cmd,打开命令提示符在cmd中输入ping v.bitedu.vip,即可看到域名解析的结果.

PS:

有的电脑上 ping 命令会报错 ping 不是内部或外部命令,也不是可运行的程序或批处理文件;

这种情况是因为有的 Windows10 默认没有启用 ping 命令;

百度搜索 windows10 启用 ping 即可;

3. query string

query string中的内容是键值对结构;其中的 key 和 value 的取值和个数,完全都是程序猿自己约定的;我们可以通过这样的方式来自定制传输我们需要的信息给服务器.

4. URL中的可省略部分

协议名:

可以省略,省略后默认为http://

ip地址/域名:

在HTML中可以省略(比如 img , link , script , a 标签的 src 或者 href 属性);省略后,表示服务器的 ip/域名与当前HTML所属的 ip/域名一致

端口号:

可以省略,省略后如果是http协议,端口号自动设为80;如果是 https 协议,端口号自动设为443.

带层次的文件路径:

可以省略,省略后相当于/;有些服务器会在发现/路径的时候自动访问 /index.html

查询字符串:

可以省略

片段标识:

可以省略

5. 关于URL encode

像/ ? : # & =…等这样的字符,已经被 URL 当做特殊意义理解了;因此这些字符不能随意出现;

某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义;

一个中文字符等非英文系的文字,由UTF-8或者GBK这样的编码方式构成,虽然在URL中没有特殊含义,但是仍然需要进行转义;

否则浏览器可能把 UTF-8/GBK 编码中的某个字节,当做URL中的特殊符号;

只不过很多浏览器为了用户看起来方便,显示 URL 某个参数的时候,显示的是转义之前的字符;

实际上,我们可以通过抓包查看真实的数据,已经是转义之后的数据;

我们在搜索框中输入中文,可以看见 URL 的其中一个 query string 键值对中,对属性的赋值还是中文;

我们使用 fiddler 来对刚刚的访问操作进行抓包:

在记事本中打开 HTTP请求 的详细信息,我们发现属性赋值的真实数据是”你好“转义后的结果:

转义这样的操作非常重要,如果没有进行转义,就可能会使浏览器或者服务器无法正确解析,请求就会失败。

转义的规则如下:

将需要转码的字符转为16进制,然后从右到左;

取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式;

例如:

"+" 被转义成了 "%2B" urldecode 就是 urlencode 的逆过程;

urlencode工具

如果要使用逆过程 urldecode ,可以把 utf-8 中的 % 去掉,然后使用 urldecode ,就可以拿到转义前的数据;

相关推荐