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 查询参数中包含了 & 或者 %

保留字符:? = & / . ... # @ $ + ; %

部分不安全字符:[ ] < > " " { } | \ ^ * · ‘ ’

posted @ 2024-05-09 13:21  低吟不作语  阅读(163)  评论(0编辑  收藏  举报