HTTP URL 详解
概述
URL 提供了一种定位因特网上任意资源的手段,大多数 URL 语法都由以下九个结构的通用格式组成:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- 方案:访问服务器以获取资源时要使用哪种协议
- 用户:某些方案访问资源时需要的用户名
- 密码:用户名后面可能要包含的密码,中间由冒号分隔
- 主机:资源宿主服务器的主机名或 IP 地址
- 端口:资源宿主服务器正在监听的踹口号,很多方案都有默认端口号(HTTP 的默认端口号为 80)
- 路径:服务器上资源的本地名,由一个斜杠(/)将其与前面的 URL 组件分隔开来
- 参数:指定输入参数,参数为键值对,URL 中可以包含多个参数,使用分号分隔
- 查询:同样用来指定输入参数,参数为键值对,URL 中可以包含多个参数,使用 & 分隔
- 片段:一小片或一部分资源的名字,引用对象时,不会将 frag 字段传送给服务器,这个字段是在客户端内部使用的
方案
方案规定如何访问指定资源的资源标识符,常用的方案有:
- HTTP:文本传输协议,除了传递普通文本,还可以传递文件流或者进制编码等信息,是目前最常用的 web 传输
- HTTPS:基于 SSL 加密的 HTTP 传输协议,比 HTTP 更加的安全
- FTP:文件传输协议,一般用来实现资源文件在服务器上的上传下载
用户名和密码
有些服务器都要求输入用户名和密码才会允许用户访问数据,FTP 服务器就是一个常见的例子:
ftp://ftp.prep.ai.mit.edulpub/gnu
第一个例子没有用户或密码组件,只有标准的方案、主机和路径,这时浏览器通常会插入一个默认的用户名和密码,用户名一般是 anonymous(匿名用户),密码则根据浏览器而异
ftp://joe:joespasswd@ftp.prep.ai.mit.edulpub/gnu
第二个例子指定了用户名(joe)和密码(joespasswd)
主机与端口号
主机组件标识了因特网上能够访问资源的宿主机器,可以用主机名(www.joes-hardware.com)或者 IP 地址来表示。端口组件标识了服务器正在监听的网络端口,对下层使用了 TCP 协议的 HTTP 来说,默认端口号为 80
路径
路径组件说明资源位于服务器的什么地方,路径通常很像一个分级的文件系统路径,比如:http://www.joes-hardware.com:80/seasonal/index-fall.html
参数
对很多方案来说,只有简单的主机名和路径是不够的,除了服务器正在监听的端口,以及是否能够通过用户名和密码访问资源外,很多协议都还需要更多的信息才能工作
为了向应用程序提供它们所需的输入参数,以便正确地与服务器进行交互,URL 中有一个参数组件。参数由键值对组成,使用 ; 将其与 URL 的其余部分以及其他参数分隔开,为应用程序提供了访问资源所需的所有附加信息,比如:
ftp://prep.ai.mit.edu/pub/gnu;type=d
在这个例子中,有一个参数 type=d,参数名为 type,值为 d
如前所述,HTTP URL 的路径组件可以分成若干路径段,每段都可以有自己的参数,比如:
http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true
这个例子就有两个路径段,hammers 和 index.html,hammers路径段有参数 sale,其值为 false,index.html 段有参数 graphics,其值为 true
查询
很多资源,比如数据库服务,都可以限定查询条件来缩小所请求资源的范围。比如,数据库维护着一张货物表,我们希望找到编号 12731 的货物,就可以使用如下 URL 来查询
http://www.joes-hardware.com/inventory-check?id=12731
多个参数之间可以用 & 分隔
http://www.joes-hardware.com/inventory-check?id=12731&color=blue
片段
有些资源类型,比如 HTML,除了资源级之外,还可以做进一步的划分。比如,对一个带有章节的大型文本文档来说,资源的 URL 会指向整个文本文档,但理想的情况是,能够指定资源中的那些章节
为了引用资源的一个片段,URL 支持使用片段(frag)组件来表示资源的一个片段。比如,URL 可以指向 HTML 文档中一个特定的图片或小节。
片段挂在 URL 的右手边,最前面有一个字符 #。比如:http://www.joes-hardware.com/tools.html#drills
在这个例子中,片段 drills 引用了页面/tools.html 中的一个部分,这部分的名字叫做 drills
HTTP 服务器通常只处理整个对象,而不是对象的片段,客户端不能将片段传送给服务器。浏览器从服务器获得了整个资源之后,会根据片段来显示你感兴趣的那部分资源
URL 编码
一般来说,URL 只能使用英文字母、阿拉伯数字和某些标点符号。如果 URL 带有中文或者特殊字符时,就需要对 URL 进行编码,使用安全字符去表示那些不安全的字符
URL 只允许使用 ASCII 字符集可以显示的字符,比如英文字母、数字、和 - _ . ~ ! *
这六个特殊字符。当在 URL 中使用不属于 ASCII 字符集的字符,如中文,空格,就要使用特殊的符号对该字符进行编码,比如空格需要用 %20
来表示
另外,还需要对 URL 中的部分保留字符和不安全字符进行编码,因为这些字符有可能产生歧义,造成服务器解析错误,比如 URL 查询参数中包含了 & 或者 %
保留字符:? = & / . ... # @ $ + ; %
部分不安全字符:[ ] < > " " { } | \ ^ * · ‘ ’