URL与资源
URL语法
URL是浏览器寻找信息时所需的资源位置,URL提供了一种统一的资源命名方式,但这些资源是可以通过不同的方案(比如HTTP、FTP、SMTP)来访问的。
大多数URL方案的URL语法都建立在这个由9个部分构成的通用格式上:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
<方案>://<用户>:<密码>@<主机>:<端口>/<路径>;<参数>?<查询>#<片段>
URL最重要的3个部分是方案(scheme)、主机(host)、和路径(path)。
组件 | 描述 | 默认值 |
---|---|---|
方案 <scheme> |
访问服务器以获取资源时要使用哪种协议 | 无 |
用户 <user> |
某些方案访问资源时需要的用户名 | 匿名 |
密码 <password> |
用户名后面可能要包含的密码,中间由冒号(:)分隔 | e-mail地址 |
主机 <host> |
资源宿主服务器的主机名或点分IP地址 | 无 |
端口 <port> |
资源宿主服务器正在监听的端口号。很多方案都有默认端口号 | 每个方案特有 |
路径 <path> |
服务器上资源的本地名,由一个斜扛(/)将其与前面的URL组件分隔开来。路径组件的语法是与服务器和方案有关的 | 无 |
参数 <params> |
某些方案会用这个组件来指定输入参数。参数为键/值对。URL中可以包含多个参数字段,它们相互之间以及与路径的其他部分之间用分号(;)分隔 | 无 |
查询 <query> |
某些方案会用这个组件传递参数以激活应用程序。查询组建的内容没有通用格式。用字符"?"将其与URL的其余部分分隔开来 | 无 |
片段 <frag> |
一小片或一部分资源的名字。引用对象时,不会将frag字段传送给服务器;这个字段是在客户端内部使用的。通过字符"#"将其与URL的其余部分分割开来 | 无 |
URL的快捷方式
Web 客户端可以理解并使用几种URL快捷方式。相对URL是在某资源内部指定一个资源的便捷缩略方式。很多浏览器还支持URL的“自动扩展”,也就是用户输入URL的一个关键(可记忆的)部分,然后由浏览器将其余部分填充起来。
相对URL
URL有两种方式:绝对的和相对的。绝对URL中包含有访问资源所需的全部信息。相对URL是不完整的。要从相对URL中获取访问资源所需的全部信息,就必须相对于另一个,被称为其基础(base)的URL进行解析。相对URL是URL的一种便捷缩略记法。
HTML文档中有一个包含了URL"./hammers.html"的超链接。这个URL看起来是不完整的,但实际上是个合法的相对 URL。可以相对于它所在文档的URL对其进行解释;使用缩略形式的相对URL语法,HTML的编写者就可以省略URL中的方案、主机和其他一些组件了。这些组件可以从它们所属资源的基础URL中推导出来。其他资源的URL也可以用这种缩略形式来表示。
基础URL为:"http://www.joes-hardware.com/tools.html" ,用这个URL作为基础,可以推导出缺失的信息。我们知道资源名为"./hammers.html",但并不知道方案或主机名是什么。通过这个基础URL,可以推导出方案为"http",主机为"www.joes-hardware.com"。
相对URL只是URL的片段或一小部分。处理URL的应用程序(比如浏览器)要能够在相对和绝对URL之间进行转换。还需要注意的是,相对URL为保持一组资源(比如一些HTML页面)的可移植性提供了一种便捷方式 。如果使用的是相对 URL,就可以在搬移一组文档的同时,仍然保持链接的有效性,因为相对 URL 都是相对于新基础进行解释的。这样就可以实现在其他服务器上提供镜像内容之类的功能了。
自动扩展URL
有些浏览器会在用户提交URL之后,或者在用户输入的时候尝试着自动扩展URL。这就为用户提供了一条捷径:用户不需要输入完整的URL,因为浏览器会自动扩展。这些“自动扩展”特性有以下两种方式。
- 主机名扩展:在主机名扩展中,只要有些小提示,浏览器通常就可以在没有帮助的情况下,将你输入的主机名扩展为完整的主机名。比如,如果在地址栏中输入yahoo,浏览器就会自动在主机名中插入"www."和".com",构建出"www.yahoo.com"。如果找不到与yahoo匹配的站点,有些浏览器会在放弃之前尝试几种扩展形式。浏览器通过这些简单的技巧来节省你的时间,减少找不到的可能。但是,这些主机名扩展技巧可能会为其他一些 HTTP 应用程序带来问题,比如代理。
- 历史扩展:浏览器用来节省用户输入URL时间的另一种技巧是,将以前用户访问过的URL历史存储起来。当你输入URL时,它们就可以将你输入的URL与历史记录中URL的前缀进行匹配,并提供一些完整的选项供你选择。因此,如果你输入了一个以前访问过的URL的开始部分,比如"http://www.joes-" ,浏览器就可能会建议使用"http://www.joes-hardware.com" 。然后你就可以选择这个地址,不用输入完整的URL了。
URL编码和字符规则
URL是可移植的(portable)。它要统一地命名因特网上所有的资源,这也就意味着要通过各种不同的协议来传送这些资源。这些协议在传输数据时都会使用不同的机制,所以,设计 URL,使其可以通过任意因特网协议安全地传输是很重要的。安全传输意味着URL的传输不能丢失信息。有些协议,所使用的传输方法就会剥去一些特定的字符。为了避开这些问题,URL只能使用一些相对较小的、通用的安全字母表中的字符。除了希望 URL 可以被所有因特网协议进行传送之外,设计者们还希望URL也可供人类阅读。因此,即使不可见、不可打印的字符能够穿过邮件程序,从而成为可移植的,也不能在URL中使用。URL还得是完整的,这就使问题变得更加复杂了。URL的设计者们认识到有时人们可能会希望URL中包含除通用的安全字母表之外的二进制数据或字符。因此,需要有一种转义机制,能够将不安全的字符编码为安全字符,再进行传输。
从历史上来看,很多计算机应用程序使用的都是US-ASCII字符集。US-ASCII使用 7 位二进制码来表示英文打字机提供的大多数按键和少数用于文本格式和硬件通知的不可打印控制字符。由于 US-ASCII 的历史悠久,所以其可移植性很好。但是,它却并不支持在各种欧洲语言或全世界数十亿人使用的数百种非罗马语言中很常见的变体字符。而且,有些URL中还会包含任意的二进制数据。认识到对完整性的需求之后,URL的设计者就将转义序列集成了进去。通过转义序列,就可以用US-ASCII字符集的有限子集对任意字符值或数据进行编码了,这样就实现了可移植性和完整性。
为了避开安全字符集表示法带来的限制,人们设计了一种编码机制,用来在URL中表示各种不安全的字符。这种编码机制就是通过一种“转义”表示法来表示不安全字符的,这种转义表示法包含一个百分号(%)。后面跟着两个表示字符ASCII码的十六进制数。在URL中,有几个字符被保留起来,有着特殊的含义。有些字符不在定义的US-ASCII可打印字符集中。还有些字符会与某些因特网网关和协议产生混淆,因此不赞成使用。
字符 | 保留/受限 |
---|---|
% | 保留作为编码字符的转义标志 |
/ | 保留作为路径组件中分隔路径段的定界符 |
. | 保留在路径组件中使用 |
.. | 保留在路径组件中使用 |
# | 保留作为分段定界符使用 |
? | 保留作为查询字符串定界符使用 |
; | 保留作为参数定界符使用 |
: | 保留作为方案、用户/口令,以及主机/端口组件的定界符使用 |
$ , + | 保留 |
@ & = | 在某些方案的上下文中有特殊的含义,保留 |
{ } ^ ~ [ ] ' | 由于各种传输Agent代理,比如各种网关的不安全处理,使用受限 |
< > " | 不安全;这些字符在URL范围之外通常是有意义的,比如在文档中对URL自身进行定界,所以应该对其进行编码 |
0x00-0x1F, 0x7F | 受限,这些十六进制范围内的字符都在US-ASCII字符集的不可打印区间内 |
>0x7F | 受限,十六进制值在此范围内的字符都不在US-ASCII字符集的7比特范围内 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。