URL(Uniform Resource Locator,统一资源定位符),作为网络资源的标准名称,使用一系列的信息标识来帮助我们定位网络资源,同时也告诉我们如何来获取资源。
实际上,URL是URI(Uniform Resource Identifier,统一资源标识符)的子集,URI作为一个基本概念,由两部分组成,URL和URN(Uniform Resource Name)。URL通过描述资源的位置来定位资源,而URN通过名字来查找资源,而不管资源是否被迁移了。
HTTP协议中使用URI来进行资源定位,但是应用程序中实际上只使用URL子集。
例如我们想要访下面的URL:
http://www.joes-hardware.com/seasonal/index-fall.html:
· URL前面的http为URL的方案(scheme),URL的方案告诉网络客户端应该如何获取这个资源,在这个例子中,URL告诉客户端使用HTTP协议来获取这个资源。
· 第二部分“www.joes-hardware.com”为服务器地址,这个信息告诉客户端到哪儿去获取这个资源。
· 最后一部分“seasonal/index-fall.html”为资源路径,资源路径标明了资源在服务器上的本地路径。
下面这张图说明了整个解析过程:
除了使用HTTP协议来获取资源,我们还可以使用其他的协议来获取互联网的资源,例如:
mailto:president@whitehouse.gov
ftp://ftp.lots-o-books.com/pub/complete-price-list.xls
file:///c:/WINDOWS/somedata.dat
rtsp://www.joes-hardware.com:554/interview/cto_video
git://github.com/user/project-name.git
ed2k://|file|%5BMAC%E7%89%88%E6%9E…
URL定义了一种命名资源的统一方式,大多数的URL都具有“scheme://server location/path”的格式,因此,对于各种不同地方的资源,无论我们获取资源的方式有何不同,命名资源的方式始终是唯一的,任何人通过这个名字都能找到这个资源。
网络资源多种多样,URL的方案也各不相同,但是他们大多都遵循统一的URL语法,下面列出了组成URL的通用的9个部分,大多数URL都符合下面的定义:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
当然,上面列出的是只是理论上的组成部分,实际当中,几乎没有URL包含上面的所有部分,URL中重要的三个部分是scheme,host和path,下表列出了每个组成部分的简要说明:
组成部分 | 描述 | 默认值 |
scheme | 定义了使用哪种协议来获取资源 | 无默认值 |
user | 获取资源需要的用户名 | 匿名 |
password | 获取资源的密码,紧跟用户名,中间以冒号“:”分隔 | <Email address> |
host | 资源服务器的主机名或者IP地址 | 无默认值 |
port | 资源服务器侦听的端口,很多scheme类型都有自己默认的端口(例如HTTP协议用80端口) | 默认值因scheme而异 |
path | 服务器上的资源的本地路径,通过斜线“/”与前面的URL部分分隔开 | 无默认值 |
params | 某些scheme中使用这个组成部分来传递输入参数,参数以键值对儿的形式出现,一个URL中可以出现多个参数,彼此之间以分号“;”分隔 | 无默认值 |
query | 某些scheme中使用query来向某些应用传参(例如数据库、公告板、搜索引擎等等),对于这部分没有特定的格式,query使用问号“?”与URL其他部分分隔开 | 无默认值 |
frag | 资源的某个部分的名称,在向服务器发请求时,并不会发送frag部分,仅在客户端内部使用,frag使用井号“#”与URL其他部分分隔开 | 无默认值 |
以http://www.joes-hardware.com:80/index.html为例,方案(scheme)为http,host为www.joes-hardware.com,port为80,path为/index.html。
下面具体来说明。
· 方案(scheme):决定了获取资源所使用的方式,它告诉应用程序应该以哪种协议来解析URL,方案必须由字母开头,通过冒号“:”与URL其他部分分隔开。方案名不区分大小写,所以HTTP和http效果相同。
· 主机名(host)和端口(port):用来指示在网络中哪一个主机拥有该资源,并且从哪一个端口进入能够访问到资源。host既可以是主机名(例如www.joes-hardware.com)也可以是IP地址,端口号则表明了服务器通过哪一个端口侦听请求。
· 用户名(username)和密码(password):在访问资源前,很多服务器需要客户端提供一个具有访问权限的用户名和密码,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的例子,会使用“anonymous”作为用户名,默认密码则因浏览器不同而有所差异。
第二个例子提供用户名为anonymous作为用户名,密码默认,用户名和密码使用“@”符号与URL的其他部分分隔开。
· 路径(path):指明了资源在服务器上的具体位置,路径通常是分层的文件路径。服务器使用路径来找到具体的资源,路径使用“/”来分段,对于每一段都可以指定参数部分(params)。
· 参数(params):对于很多方案,仅仅提供主机名和路径是不够的,例如FTP使用两种方式传输文件:二进制(binary)和纯文本(text),如果不通过指定参数来区分的话,就无法得到正确的资源格式。URL中的参数为键值对儿,通过分号来分隔,用来提供额外的信息,例如:
ftp://prep.ai.mit.edu/pub/gnu;type=d
其中type=d是唯一的参数。
我们前面提到了,路径的每一段都可以指定参数,下面就是一个例子:
http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true
· 查询字符串(querystring):有些资源,例如数据库资源,可以通过查询字符串来缩小查询范围,比如:
http://www.joes-hardware.com/inventory-check.cgi?item=12731
通过请求字符串来返回id是12731的item。
对于查询字符串来说没有格式上的要求,但是有些字符不能出现,需要进行转义,并且按照惯例来说,查询字符串通常由一系列的“name=value”组成,中间由“&”符号进行连接。
· 对于某些资源类型,例如HTTP资源,可以对资源进一步细分,例如一个大的文本可以细分为段落,通过URL可以找到改文本资源,但是更理想的是,可以精确到每一段。
例如下面的例子:
http://www.joes-hardware.com/tools.html#drills
用来获取tools.html上名为“drills”的部分。由于HTTP服务器通常只处理整个资源,因此浏览器实际上并不会将frag发送给服务器,当从服务器返回整个资源后,浏览器根据frag部分对结果进行筛选展示。
摘译自《HTTP-The Definitive Guide》 by David Gourley & Brian Totty,内容有改动。