2.3 URL 快捷方式

Web 客户端可以理解并使用几种 URL 快捷方式。相对 URL 是在某资源内部指定一个资源的便捷缩略方式。很多浏览器还支持 URL 的“自动扩展”,也就是用户输入 URL 的一个关键(可记忆的)部分,然后由浏览器将其余部分填充起来。2.3.2 节 对此进行了解释。

2.3.1 相对URL

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

另一方面,相对 URL 是不完整的。要从相对 URL 中获取访问资源所需的全部信息,就必须相对于另一个,被称为其基础(base)的 URL 进行解析。

相对 URL 是 URL 的一种便捷缩略记法。如果你手工写过 HTML 的话,可能就会发现相对 URL 是多么便捷了。例 2-1 是一个嵌入了相对 URL 的 HTML 文档实例。

例 2-1 带有相对 URL 的 HTML 代码片段

  1. <HTML>
  2. <HEAD><TITLE>Joe's Tools</TITLE></HEAD>
  3. <BODY>
  4. <H1> Tools Page </H1>
  5. <H2> Hammers <H2>
  6. <P> Joe's Hardware Online has the largest selection of <A HREF="./hammers.html">hammers
  7. </A> on earth.
  8. </BODY>
  9. </HTML>

例 2-1 是资源:

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

的 HTML 文档。

在这个 HTML 文档中有一个包含了 URL ./hammers.html 的超链接。这个 URL 看起来是不完整的,但实际上是个合法的相对 URL。可以相对于它所在文档的 URL 对其进行解释;在这个例子中,就是相对于 Joe 的五金商店 Web 服务器的资源 /tools.html。

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

在例 2-1 中,基础 URL 为:

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

用这个 URL 作为基础,可以推导出缺失的信息。我们知道资源名为 ./hammers.html,但并不知道方案或主机名是什么。通过这个基础 URL,可以推导出方案为 http,主机为 www.joes-hardware.com。图 2-4 对此进行了说明。

2.3 URL 快捷方式 - 图1

图 2-4 使用基础 URL

相对 URL 只是 URL 的片段或一小部分。处理 URL 的应用程序(比如浏览器)要能够在相对和绝对 URL 之间进行转换。

还需要注意的是,相对URL为保持一组资源(比如一些HTML页面)的可移植性提供了一种便捷方式 。如果使用的是相对 URL,就可以在搬移一组文档的同时,仍然保持链接的有效性,因为相对 URL 都是相对于新基础进行解释的。这样就可以实现在其他服务器上提供镜像内容之类的功能了。

  • 基础URL

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

  • 在资源中显式提供

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

  • 封装资源的基础 URL

如果在一个没有显式指定基础 URL 的资源中发现了一个相对 URL,如例 2-1 所示,可以将它所属资源的 URL 作为基础(如例中所示)。

  • 没有基础 URL

在某些情况下,没有基础 URL。这通常意味着你有一个相对 URL;但有时可能只是一个不完整或损坏了的 URL。

  • 解析相对引用

前面我们介绍了 URL 的基本组件和语法。要将相对 URL 转换为一个绝对 URL,下一步要做的就是将相对 URL 和基础 URL 划分成组件段。

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

2.3 URL 快捷方式 - 图2

图 2-5 将相对 URL 转换成绝对 URL

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

可以对例 2-1 中的 ./hammers.html 实例使用图 2-5 中描述的算法。

2.3.2 自动扩展URL

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

这些“自动扩展”特性有以下两种方式。

  • 主机名扩展

在主机名扩展中,只要有些小提示,浏览器通常就可以在没有帮助的情况下,将你输入的主机名扩展为完整的主机名。

比如,如果在地址栏中输入 yahoo,浏览器就会自动在主机名中插入 www. 和 .com,构建出 www.yahoo.com。如果找不到与 yahoo 匹配的站点,有些浏览器会在放弃之前尝试几种扩展形式。浏览器通过这些简单的技巧来节省你的时间,减少找不到的可能。

但是,这些主机名扩展技巧可能会为其他一些 HTTP 应用程序带来问题,比如代理。第 6 章将详细讨论这些问题。

  • 历史扩展

浏览器用来节省用户输入 URL 时间的另一种技巧是,将以前用户访问过的 URL 历史存储起来。当你输入 URL 时,它们就可以将你输入的 URL 与历史记录中 URL 的前缀进行匹配,并提供一些完整的选项供你选择。因此,如果你输入了一个以前访问过的 URL 的开始部分,比如 http://www.joes-,浏览器就可能会建议使用 http://www.joes-hardware.com。然后你就可以选择这个地址,不用输入完整的 URL 了。

注意,与代理共同使用时,URL 自动扩展的行为可能会有所不同。6.5.6 节将对此进行进一步讨论。