《HTTP权威指南》第二章 URL与资源
URL的作用
URL 就是因特网资源的标准化名称。URL 指向一条条电子信息片段,告诉你它们位于何处,以及如何与之进行交互。
URL的组成
比如说,你想要获取 URL http://www.joes-hardware.com/seasonal/index-fall.html。那么 URL 分以下三部分。
URL 的第一部分(http)是 URL 方案(scheme)。方案可以告知 Web 客户端怎样访问资源。在这个例子中,URL 说明要使用 HTTP 协议。
URL 的第二部分(www.joes-hardware.com)指的是服务器的位置。这部分告知 Web 客户端资源位于何处。
URL 的第三部分(/seasonal/index-fall.html)是资源路径。路径说明了请求的是服务器上哪个特定的本地资源。
URL 提供了一种统一的资源命名方式。大多数 URL 都有同样的:"方案 :// 服务器位置 / 路径"结构。
URL 的语法
URL 提供了一种定位因特网上任意资源的手段,但这些资源是可以通过各种不同的方案(比如 HTTP、FTP、SMTP)来访问的,因此 URL 语法会随方案的不同而有所不同。但大部分 URL 都遵循通用的 URL 语法,而且不同 URL 方案的风格和语法都有不少重叠。
大多数 URL 方案的 URL 语法都建立在这个由 9 部分构成的通用格式上:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
几乎没有哪个 URL 中包含了所有这些组件。URL 最重要的 3 个部分是方案(scheme)、主机(host)和路径(path)
方案
方案实际上是规定如何访问指定资源的主要标识符,它会告诉负责解析 URL 的应用程序应该使用什么协议。在我们这个简单的 HTTP URL 中所使用的方案就是 http
主机与端口
要想在因特网上找到资源,应用程序要知道是哪台机器装载了资源,以及在那台机器的什么地方可以找到能对目标资源进行访问的服务器。URL 的主机和端口组件提 供了这两组信息。
主机组件标识了因特网上能够访问资源的宿主机器。
端口组件标识了服务器正在监听的网络端口。对下层使用了 TCP 协议的 HTTP 来说,默认端口号为 80。
用户名和密码
很多服务器都要求输入用户名和密码才会允许用户访问数据。FTP 服务器就是这样一个常见的实例。这里有几个例子:
ftp://ftp.prep.ai.mit.edu/pub/gnu
ftp://anonymous@ftp.prep.ai.mit.edu/pub/gnu
ftp://anonymous:my_passwd@ftp.prep.ai.mit.edu/pub/gnu
http://joe:joespasswd@www.joes-hardware.com/sales_info.txt
如果向浏览器提供一个 FTP URL,但没有指定用户名和密码,它就会插入 anonymous(匿名用户)作为你的用户名,并发送一个默认的密码(Internet Explorer 会发送 IEUser,Netscape Navigator 则会发送 mozilla)。
路径
URL 的路径组件说明了资源位于服务器的什么地方。路径通常很像一个分级的文件系统路径。比如:
http://www.joes-hardware.com:80/seasonal/index-fall.html
这个 URL 中的路径为 /seasonal/index-fall.html
参数
为了向应用程序提供它们所需的输入参数,以便正确地与服务器进行交互,URL 中有一个参数组件。
这个组件就是 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。
查询字符串
假设 Joe 的五金商店在数据库中维护着一个未售货物的清单,并可以对清单进行查询,以判断产品是否有货,那就可以用下列 URL 来查询 Web 数据库网关,看看编号为 12731 的条目是否有货:
http://www.joes-hardware.com/inventory-check.cgi?item=12731
这个 URL 的大部分都与我们见过的其他 URL 类似。只有问号(?)右边的内容是新出现的。这部分被称为查询(query)组件。
http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue
在这个例子中,查询组件有两个名 / 值对:item=12731 和 color=blue。查询的目的是检查清单中是否有尺寸为 large、颜色为 blue 的条目 12731。
片段
为了引用部分资源或资源的一个片段,URL 支持使用片段(frag)组件来表示一个资源内部的片段。比如,URL 可以指向 HTML 文档中一个特定的图片或小节。
片段挂在 URL 的右手边,最前面有一个字符"#"。比如:
http://www.joes-hardware.com/tools.html#drills
在这个例子中,片段 drills 引用了 Joe 的五金商店 Web 服务器上页面 /tools.html 中的一个部分。这部分的名字叫做 drills。
HTTP 服务器通常只处理整个对象,而不是对象的片段,客户端不能将片段传送给服务器。浏览器从服务器获得了整个资源之后,会根据片段来显示你感兴趣的那部分资源。
服务器处理的是整个对象,因此 URL 片段仅由客户端使用
附录