1.2 URL与资源
将网络映射为现实生活,网络线路的连接过程就好比城市打车,从某个地方出发,告诉司机想去的地址名称,司机就会知道这次的行动路线。而URL就是浏览器寻找信息所需要的资源位置(目的地)。
1.2.1 URL语法
URL提供了一种定位因特网上任意资源的手段,但是这些资源是可以通过不同的方案(如HTTP, FTP, SMTP)来访问的。
大多说URL方案的语法都建立在下面这个通用格式:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
组件 | 描述 | 默认值 |
---|---|---|
scheme(方案) | 访问服务器资源时使用的是哪种协议 | 无 |
user(用户) | 访问某些资源时需要的用户名 | 匿名 |
password(密码) | 访问某些资源时可能需要的密码(冒号 : 分割) | <email地址> |
host(主机) | 资源宿主服务器的主机名或者分点ip地址 | 无 |
port(端口) | 资源宿主服务器正在监听的端口号 | 每个方案特有 |
path(路径) | 服务器上资源的本地名,用斜杠(/)将每个层级分开 | 无 |
params(参数) | 某些方案会用这个组件指定输入参数,参数为名值对(用分号 ; 与其他部分分割) | 无 |
query(查询) | 某些方案用这个组件传递参数,激活相关的应用程序,获取动态的或者个性化的结果(用问号 ?与其他部分分割) | 无 |
frag(片段) | 一小片或者一部分资源的名字。引用对象时不会将frag字段传送给服务器,通常实在客户端内部使用的。(用井号 # 与其他部分分割) | 无 |
scheme
:必须以字母开头,用第一个:与后面的内容作区分。方案名与大小写无关(http=HTTP)port
: 对于http来说默认端口为80 , https协议默认端口为443user:password
: 如FTP协议就需要用户名密码。没有提供用户名密码时FTP会插入一个默认的用户名和密码(如anonymous),提供用户名密码的情况下用”@“将其与其他部分分隔开来path
: UNIX文件系统中的文件系统路径方法,用”/“分隔路径为路径段(path segment)params
: 很多协议需要提供参数来使客户端和服务器正确地进行交互。
如http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true
其中有两个路径段,参数hammers值为false,参数graphics值为truequery
: 之前带有”?“标识query的开始,查询的字符串以一系列名值对的形式出现,名值对中间用”&“分隔
如http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue
其中查询组件有两个名值对,item=12731和color=bluefrag
: 服务器只会处理整个对象而不是对象的一部分,浏览器从服务器获得了整个资源后会根据片段来显示你(感兴趣的)请求的那部分资源。
如:http://www/jose-hardware.com/tools.html#drills
这时服务器会响应整个tools.html资源,浏览器会将页面显示到drills部分
1.2.2 URL快捷方式
-
相对URL
在同一目录下,只使用"./xxxx.html"代替完整的URL是可行的
访问上一级的相对URL:"…/xxxx.html"
内部解析相对引用的步骤:
- html标签显式提供了URL,那就通过它来转换那个html文档中的所有相对URL
- 没有显式指定那就将它所属资源的URL作为基础
- 然后解析相对引用,它会在相对URL中根据URL结构查找其组件,如果组件不存在,就继承基础URL的组件值,用户,密码,主机,端口,路径,参数,查询组件。其中若在路径部分的解析中是没有前导”
/
“的非空路径,就删除前导”./
“,若带有前导”/“则要处理绝对路径
-
扩展URL
浏览器中只输入baidu也能直接进入www.baidu.com页面,这是因为浏览器会自动扩展。
- 主机名扩展:自动插入www .com之类的操作
- 历史扩展:根据历史浏览记录扩展输入的地址
1.2.3 URL中令人头疼的字符
URL是可以移植的(portable),意味着URL可以通过任意因特网协议安全的传输。安全传输意味着在不同的协议之中要使用能够统一的相对较小的,通用的安全字母表中的字符。
URL还应该是可读的。不可打印的字符(如空格符)应该被禁止在URL中使用。
URL还得是完整的。有时人们可能希望URL包含除通用的安全字母表之外的二进制数据或者字符,因此就需要一种转义机制。能将不安全编码转义成安全字符,再进行传输。
“转义”表示法:包含一个百分号(%),后面跟着两个表示字符ASCII码的十六进制数。如:
字符 | ASCII码 | url |
---|---|---|
~ | 126(0x7E) | …%7E… |
空格 | 32(0x20) | …%20… |
% | 37(0x25) | …%25… |
除了转义字符,URL中还有一些字符被保留起来,有特殊的含义。将这些字符用于保留用途之外的场合时,要对URL中对其进行编码。如:
字符 | 保留/受限 | 字符 | 保留/受限 |
---|---|---|---|
% | 转义标志 | / | 分隔路径 |
. | 路径组件中使用 | … | 路径组件中使用 |
# | 分段分界符 | ? | 查询定界符 |
; | 参数定界符 | : | 名值对 |
$ , + | 保留 | @ & = | 某些方案中需要使用,保留 |
… |
客户端应用程序在向其他应用程序发送任意URL之前,最好把所有不安全或者受限的字符都进行转换。这样这个URL就是可以在各个应用程序之间共享的规范形式。
1.2.4 URL中的方案
常用的方案(scheme):
方案 | 描述 |
---|---|
http | 超文本传输协议,默认端口80,除开没有用户名密码其他的与通用格式相符,基本格式为:**http://<host>:<port>/<path>;<params>?<query>#<frag>** |
https | http over SecureSocket Layer,默认端口443,SSL提供端到端的加密机制,其他部分与http相同。基本格式为:**https://<host>:<port>/<path>;<params>?<query>#<frag>** |
mailto | 指向E-mail地址,基本格式:mailto:<RFC-822-ADDR-SPEC> , 示例:mailto:joe@joes-hardware.com |
ftp | 文件传输协议,用来从ftp服务器上下载或上传文件。格式:**ftp://<user>:<password>@<host>:<port>/<path>;<params>** |
rtsp, rtspu | RTSP URL是可以通过实时流传输协议(Real Time Streaming Protocol)解析音频视频媒体资源的标识符。rtspu的u代表使用UDP协议获取资源。格式:**rstp://<user>:<password>@<host>:<port>/<path>** |
file | 表示一台指定主机上可直接访问的文件,如果主机未指明则默认为正在使用URL的本地主机**file://<host>/<path>** |
news | 用来访问特定的新闻组 |
telnet | 用于访问交互式业务。它代表的不是对象自身,而是可以通过telant协议访问的交互式应用程序(资源)。格式:**telant://<user>:<password>@<host>:<port>/** |
1.2.5 URL的未来展望
URL的确使用很广,是一个基于地址的命名机制。但是当资源从该地址移走,你就有可能找不到它了。URN(统一资源名,Uniform resource name)是为每一个资源指定一个名字,如果可以实现,那么无论资源移到何处,都能够追踪它,因为你已经知道了它不会变的名字。
PURL(persistent uniform resource locatoes,永久统一资源定位符)是用URL来实现URN功能的一个例子。其基本思想是再搜索资源的过程中引入另外一个中间层,通过一个中间资源定位符(resource locator)服务器对资源的实际URL进行登记和跟踪。客户端可以向定位符请求一个PURL,定位符可以以一个资源作为响应,将客户端重定向到资源当前的实际URL上去。
但是实际上URN还没有投入使用。因为改动意味着要进行大量的工作,可能还要等待更适合的时机才能进行这种转换。