第二章、URL与资源
1 URL统一资源定位符
URL 是浏览器寻找信息时所需的资源位置。通过 URL,人类和应用程序才能找到、使用并共享因特网上大量的数据资源。
URL是作为URI的一个子集,URI是一类更通用的资源标识符,主要是由URL和URN构成。HTTP 规范将更通用的概念 URI 作为其资源标识符,但实际上,HTTP 应用程序处理的只是 URI 的 URL 子集。
URL主要内容由三部分组成
- 方案scheme:说明访问资源所使用的协议,如:HTTP协议(http://)
- 第二部分为服务器的地址,告知web客户端资源位于何处,如:www.example.com
- 其余部分用于指定服务器上的具体某个资源路径,如:/doc/guide.html
URI被称为统一资源标识符(Uniform Resource Identier,URI)
统一资源名(URN)为URI的第二种形式。其是作为通过名字来识别资源的,和其所处位置无关。也就是说,我们从一个地方将该资源转移到另外一个地方,不会影响他的URN,我们还是能通过其URN定位到该资源
2 URL语法
URL提供了一种定位Internet上资源的手段。但是这些资源可以通过不同的Scheme进行访问(如:HTTP, FTP, STMP),同时使用的Schema不同,URL的语法也会有一定程度的差异。虽然有差异,但是大部分URL都会遵循如下规则:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
但是一般看到的URL都不会完整包含全部内容,一般都只是其中某些部分的组合。下表是对每个部分的说明:
2.1 scheme——使用什么协议
scheme用于规定如何访问指定资源的主要表示标识符,会告诉负责解析URL的应用程序使用什么协议。由第一个":"符号将其余URL其他组件分开(如http:表示用的HTTP协议),同时其是大小写不敏感的,即:“http:”和“HTTP:”是等价的。
2.2 主机与端口
前面的scheme只是告诉服务器用什么协议来访问资源,但是要怎么找到安装有服务器的机器呢,就是通过主机,找到主机后,有可能一台主机上面会有很多服务,我们需要找到指定的服务(应用程序),这个时候就需要指定该应用程序监听的端口。所以最终通过主机和端口就能最终确定服务所在的位置了。
一般主机有两种表示方式,一直是直接用IP(Internet Procotol)地址,一种使用域名表示,结合端口表示如下:
方式 地址
IP地址 http://161.58.228.45:80/index.html
域名 http://www.example.com:80/index.html
假设上述的161.58.288.45的IP就是对域名www.example.com对应的IP的话,那两者访问的就是同一服务器上的同一资源。
2.3 用户名和密码
用户名和密码用“@”符号将它和其他URL组件分隔开来,但并不是所有的URL都会有用户名和密码,如:
- 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
这些都是合法的URL地址。第一个是没有用户名和密码的,第二个是只有用户名,第三个是有用户名和密码的。
2.4 路径
URL中的路径组件说明了资源存在于服务器的什么位置。
如:
http://www.joes-hardware.com:80/seasonal/index-fall.html
这个URL中的“/seasonal/index-fall.html”就是路径。一般用“/”将路径分为各路径段。
2.5 参数(了解)
参数是一个不太常见的URL组件,但是有部分服务器仅从路径名和端口是不足以让服务器提供所需资源,还需要一些参数。参数组件是由键值对组成,一般通过“;”字符和其他组件分隔开。
如:
ftp://prep.ai.mit.edu/pub/gnu;type=d
该URL里面就包含一个type=d的参数组件。
2.6 查询字符串
很多资源,比如数据库服务,都是可以通过提问题或进行查询来缩小所请求资源类型范围的。一般通过“?”字符同其他组件隔开,
如:
http://www.joes-hardware.com/inventory-check.cgi?item=12731
里面的item=12731就是一个查询字符串。如果一个查询字符串包含多个查询参数,可以使用"&"隔开,
如:
http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue
2.7 片段
有些资源类型,比如 HTML,除了资源级之外,还可以做进一步的划分。比如,对一个带有章节的大型文本文档来说,资源的 URL 会指向整个文本文档,但理想的情况是,能够指定资源中的那些章节。
为了引用部分资源或资源的一个片段,URL 支持使用片段(frag)组件来表示一个资源内部的片段。比如,URL 可以指向 HTML 文档中一个特定的图片或小节。
HTTP服务器通常只处理整个对象,而不是对象的片段,客户端不能将片段传送给服务器。浏览器从服务器获得了整个资源之后,会根据片段来显示你感兴趣的那部分资源。
3 URL快捷方式
这里所说的“快捷方式”是指一些不完整的URL,如:相对URL,自动扩展等
3.1 相对URL
如果写过前端HTML页面的朋友对这个概念应该不会陌生。大部分HTML文档内的跳转链接都使用了相对URL。所谓的相对URL,就是相对于一个基础URL(baseUrl)。如一个HTML文档的资源URL是http://www.joes-hardware.com/tools.html,该文档内容如下:
<HTML> <HEAD><TITLE>Joe's Tools</TITLE></HEAD> <BODY> <H1> Tools Page </H1> <H2> Hammers <H2> <P> Joe's Hardware Online has the largest selection of <A HREF="./hammers.html">hammers </A> on earth. </BODY> </HTML>
这里根据该文档本身的资源URL,可以推断出baseUrl为http://www.joes-hardware.com/。这个文档里面的./hammers.html就是相对URL,一般浏览器解析的时候会自动加上baseURL组成完整的URLhttp://www.joes-hardware.com/hammers.html对其进行访问。
3.2 自动扩展URL
有些浏览器会在用户提交 URL 之后,或者在用户输入的时候尝试着自动扩展 URL。这就为用户提供了一条捷径:用户不需要输入完整的 URL,因为浏览器会自动扩展。自动扩展主要有以下几种方式:
- 主机名扩展:如我们输入baidu,一般浏览器就能自动扩展为www.baidu.com。
- 历史扩展:如果你之前访问过http://www.joes-hardware.com,如果你再次在浏览器输入joes,它就会自动扩展出完整的URL地址。
4 字符编码
URL为了达到可移植和安全传输的特性,所以URL只能使用一些较小的,相对安全的字母表中的字符。但是一些使用URL的人又希望用一些不在规定字母表中的字符,这个时候就需要对这些字符进行编码转义,然后再进行传输。
4.1 URL字符集
我想从事计算机相关行业的人对US-ASCII 字符集都不会陌生,而且由于其历史悠久,所以可移植性也非常好,但是该字符集对英语语言非常友好,但是对于其他语言比如中文的支持非常不好。URL 的设计者就将转义序列集成了进去。通过转义序列,就可以用 US-ASCII 字符集的有限子集对任意字符值或数据进行编码了,这样就实现了可移植性和完整性。
4.2 编码机制
为了达到上述的目的,传输和使用一些非ASCII字符集的字符或者数据,就设计出了一种编码机制,通过“转义”的方式来表示那些不安全的的字符。其表示方法为:**一个百分号(%),后面跟着两个表示字符 ASCII 码的 十六进制数。**比如:
4.3 字符限制
在 URL 中,有几个字符被保留起来,有着特殊的含义,或者一些其他用途的字符。这些字符一般对使用有限制,除了用在其本身保留使用的场合外,也需要在URL中对齐编码。
5 Scheme
这里列出一些常见的协议和简要说明:
方 案 | 描 述 |
http |
超文本传输协议方案,除了没有用户名和密码之外,与通用的URL格式相符。如果省略了端口,就默认为80。基本格式: |
https |
方案https与方案http是一对。唯一的区别在于方案https使用了网景的SSL,SSL为HTTP连接提供了端到端的加密机制。其语法与HTTP的语法相同,默认端口为443。 |
mailto |
Mailto URL指向的是E-mail地址。由于E-mail的行为与其他方案都有所不同(它并不指向任何可以直接访问的对象),所以mailto URL的格式与标准URL的格式也有所不同。因特网E-mail地址的语法记录在RFC 822中。基本格式: |
ftp |
文件传输协议URL可以用来从FTP服务器上下载或向其上载文件,并获取FTP服务器上的目录结构内容的列表。在Web和URL出现之前FTP就已经存在了。Web应用程序将FTP作为一种数据访问方案使用。URL语法遵循下列通用格式。基本格式: |
rtsp,rtspu |
方案file表示一台指定主机(通过本地磁盘、网络文件系统或其他一些文件共享系统)上可直接访问的文件。各字段都遵循通用格式。如果省略了主机名,就默认为正在使用URL的本地主机。基本格式: |
news |
根据RFC 1036的定义,方案news用来访问一些特定的文章或新闻组。它有一个很独特的性质:news URL自身包含的信息不足以对资源进行定位。news URL中缺乏到何处获取资源的信息——没有提供主机名或机器名称。从用户那里获取此类信息是解释程序的工作。比如,在网景浏览器的“选项”(Options)菜单中,就可以指定自己的NNTP(news)服务器。这样,浏览器有了news URL的时候就知道应该使用哪个服务器了。新闻资源可以从多台服务器中获得。它们被称为位置无关的,因为对它们的访问不依赖于任何一个源服务器。news URL中保留了字符“@”,用来区分指向新闻组的news URL和指向特定新闻文章的news URL。基本格式: |
telnet |
方案telnet用于访问交互式业务。它表示的并不是对象自身,而是可通过telnet协议访问的交互式应用程序(资源)。基本格式: |
永久统一资源定位符PURL :基本思想是在搜索资源的过程中引入另一个中间层,通过一个中间资源定位符(resource locator)服务器对资源的实际URL进行登记和追踪。