09 一个完整的URL

Posted by CodingWithAlice on April 21, 2021

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 四个部分组成,但有的部分可以视情况省略:

image-20210421151117383

  • scheme 方案名/协议名

    表示资源应该使用哪种协议来访问,例如 httphttps,以及不常见的ftpldapfilenews

  • scheme 之后,必须是三个特定的字符 ://

    作用是分离 scheme 和后面部分

  • :// 之后,是被称为 authority 的部分

    表示资源所在的主机名,通常的形式是 host:port,即主机名加端口号

    • 主机名可以是 IP 地址或者域名的形式,必须要有
    • 端口号有时可以省略,浏览器等客户端会依据 scheme 使用默认的端口号
  • path - 标记资源所在位置

    • URIpath 部分必须以 / 开始,也就是必须包含 /

    • 举个例子

      客户端和服务器看到的 URI 是不一样的

      • 现象:

        客户端看到的必须是完整的 URI,使用特定的协议去连接特定的主机

        而服务器看到的只是报文请求行里被删除了协议名和主机名的 URI

      • 原因:协议名和主机名已经分别出现在了请求行的版本号和请求头的 Host 字段里,没有必要再重复

        image-20210421151216966

  • query - 对资源附加的额外要求 用一个 ? 开始,但不包含 ?,表示对资源附加的额外要求 格式:多个 key=value 的字符串,这些 KV 值用字符 & 连接

URI 的完整格式

真正完整的格式如下,可以注意到多出两部分:

1、协议名之后、主机名之前的身份信息:表示登录主机时的用户名和密码,但现在已经不推荐使用这种形式了,严重的安全隐患

2、查询参数后的片段标识符 #fragment :是 URI 所定位的资源内部的一个“锚点”或者说是“标签”,浏览器可以在获取资源后直接跳转到它指示的位置 –> 但仅能由浏览器这样的客户端使用,服务器是看不到的

image-20210421151255049

URI 的编码

如果要在 URI 里使用英语以外的汉语、日语等其他语言?

URI引入了编码机制,对于ASCII码以外的字符集和特殊字符做一个特殊的操作 — 转义

  • 转义原则

    直接把非 ASCII 码或特殊字符转换成十六进制字节值,然后前面再加上一个 %