HTTP(二)URL与资源

浏览因特网资源

URL 是浏览器寻找信息时所需的资源位置。

URI 是一类更通用的资源标识符,URL 实际上是它的一个子集。URI 是一个通用的概念,由两个主要的子集URL 和URN 构成,URL 是通过描述资源的位置来标识资源的,而URN(本章稍后会介绍)则是通过名字来识别资源的,与它们当前所处位置无关。

比如说,你想要获取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 可以通过HTTP 之外的其他协议来访问资源。它们可以指向因特网上的任意资源,或者个人的E-mail 账户:

mailto:president@whitehouse.gov

或者通过其他协议(比如FTP 协议)访问的各种文件:

ftp://ftp.lots-o-books.com/pub/complete-price-list.xls

或者从流视频服务器上下载电影:

rtsp://www.joes-hardware.com:554/interview/cto_video

URL的语法

大多数URL方案的URL 语法都建立在这个由9 部分构成的通用格式上:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

URL 最重要的3 个部分是方案(scheme)、主机(host)和路径(path)

方案——使用什么协议

方案实际上是规定如何访问指定资源的主要标识符,它会告诉负责解析URL 的应用程序应该使用什么协议。

方案组件必须以一个字母符号开始,由第一个“:”符号将其与URL 的其余部分分隔开来。方案名是大小写无关的。

主机与端口

主机组件标识了因特网上能够访问资源的宿主机器。可以用主机名,或者IP 地址来表示主机名。

端口组件标识了服务器正在监听的网络端口。对下层使用了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

路径

URL 的路径组件说明了资源位于服务器的什么地方。路径通常很像一个分级的文件系统路径。

可以用字符“/”将HTTP URL 的路径组件划分成一些路径段(path segment)(还是与UNIX 文件系统中的文件路径类似)。每个路径段都有自己的参数(param)组件。

参数

URL 中有一个参数组件。这个组件就是URL 中的名值对列表,由字符“;”将其与URL 的其余部分(以及各名值对)分隔开来。

ftp://prep.ai.mit.edu/pub/gnu;type=d
http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true

查询字符串

http://www.joes-hardware.com/inventory-check.cgi?item=12731

问号(?)右边的内容被称为查询(query)组件。URL 的查询组件和标识网关资源的URL 路径组件一起被发送给网关资源。

片段

为了引用部分资源或资源的一个片段,URL 支持使用片段(frag)组件来表示一个资源内部的片段。比如,URL 可以指向HTML 文档中一个特定的图片或小节。

片段挂在URL 的右手边,最前面有一个字符“#”。

http://www.joes-hardware.com/tools.html#drills

HTTP 服务器通常只处理整个对象,3而不是对象的片段,客户端不能将片段传送给服务器。浏览器从服务器获得了整个资源之后,会根据片段来显示你感兴趣的那部分资源。

URL快捷方式

相对URL

URL 有两种方式:绝对的和相对的。到目前为止,我们只见过绝对URL。绝对URL 中包含有访问资源所需的全部信息。

相对URL 是URL 的一种便捷缩略记法。

<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 看起来是不完整的,但实际上是个合法的相对URL。可以相对于它所在文档的URL 对其进行解释。

使用缩略形式的相对URL 语法,HTML 的编写者就可以省略URL 中的方案、主机和其他一些组件了。这些组件可以从它们所属资源的基础URL 中推导出来。

1.基础URL

转换处理的第一步就是找到基础URL。基础URL 是作为相对URL 的参考点使用的。可以来自以下几个不同的地方。

  • 在资源中显式提供

    有些资源会显式地指定基础URL。比如,HTML 文档中可能会包含一个定义了基础URL 的HTML 标记<BASE>,通过它来转换那个HTML 文档中的所有相对URL。

  • 封装资源的基础 URL
    如果在一个没有显式指定基础URL 的资源中发现了一个相对URL,可以将它所属资源的URL 作为基础
  • 没有基础 URL
    在某些情况下,没有基础URL。这通常意味着你有一个绝对URL;但有时可能只是一个不完整或损坏了的URL。

2.解析相对引用

要将相对URL 转换为一个绝对URL,下一步要做的就是将相对URL 和基础URL 划分成组件段。

这样只是在解析URL,但这种做法会将其划分成一个个组件,因此通常会称作分解(decomposing)URL。只要将基础和相对URL 划分成了组件,就可以应用图中算法来完成转换了。

这个算法将一个相对URL 转换成了其绝对模式,之后就可以用它来引用资源了。这个算法最初是在RFC 1808 中制定的,后来被合并到了RFC 2396 中。

自动扩展URL

有些浏览器会在用户提交URL 之后,或者在用户输入的时候尝试着自动扩展URL。这就为用户提供了一条捷径:用户不需要输入完整的URL,因为浏览器会自动扩展。

分为主机名扩展和历史扩展。

各种令人头疼的字符

URL字符集

很多计算机应用程序使用的都是US-ASCII 字符集。它却并不支持很常见的变体字符。设计者就将转义序列集成了进去,通过转义序列,就可以用US-ASCII 字符集的有限子集对任意字符值或数据进行编码了,这样就实现了可移植性和完整性。

编码机制

 

转义表示法包含一个百分号(%),后面跟着两个表示字符ASCII 码的十六进制数。

字符限制

在URL 中,有几个字符被保留起来,有着特殊的含义。有些字符不在定义的USASCII可打印字符集中。还有些字符会与某些因特网网关和协议产生混淆,因此不赞成使用。

 

posted @ 2017-12-12 20:19  hahazexia  阅读(566)  评论(0)    收藏  举报