2.2 URL 的语法
- URL 语法会随方案/协议(比如HTTP、FTP、SMTP)的不同而有所不同,但不是完全不同。
- 大部分 URL 都遵循通用的 URL 语法,而且不同 URL 方案的风格和语法都有不少重叠。
- 大多数 URL 方案的 URL 语法都建立在这个由 9 部分构成的通用格式上:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- 几乎没有哪个 URL 中包含了所有这些组件。URL 最重要的 3 个部分是方案/协议(scheme)、主机(host)和路径(path)。
- 通用URL组件:
组件 | 描述 | 默认值 |
---|---|---|
方案<scheme>
|
访问服务器以获取资源时要使用哪种协议 | 无 |
用户<user>
|
某些方案访问资源时需要的用户名 | 匿名 |
密码<password>
|
用户名后面可能要包含的密码,中间由冒号(:)分隔 | |
主机<host>
|
资源宿主服务器的主机名或点分 IP 地址 | 无 |
端口<port>
|
资源宿主服务器正在监听的端口号。很多方案都有默认端口号(HTTP 的默认端口号为 80) | 每个方案特有 |
路径<path>
|
服务器上资源的本地名,由一个斜杠(/)将其与前面的 URL 组件分隔开来。路径组件的语法是与服务器和方案有关的(本章稍后会讲到 URL 路径可以分为若干个段,每段都可以有其特有的组件。) | 无 |
参数<params>
|
某些方案会用这个组件来指定输入参数。参数为名 / 值对。 URL 中可以包含多个参数字段,它们相互之间以及与路径的其余部分之间用分号(;)分隔 | 无 |
查询<query>
|
某些方案会用这个组件传递参数以**应用程序(比如数据库、公告板、搜索引擎以及其他因特网网关)。查询组件的内容没有通用格式。用字符“?”将其与 URL 的其余部分分隔开来 | 无 |
片段<frag>
|
一小片或一部分资源的名字。引用对象时,不会将 frag 字段传送给服务器;这个字段是在客户端内部使用的。通过字符“#”将其与 URL 的其余部分分隔开来 | 无 |
1. 方案<scheme>
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- 方案
<scheme>
:实际上是规定如何访问指定资源的主要标识符,它会告诉负责解析 URL 的应用程序应该使用什么协议,比如HTTP、FTP、SMTP。 - 方案组件必须以一个字母符号开始,由第一个“:”符号将其与 URL 的其余部分分隔开来。
- 方案名是大小写无关的。
2. 主<host>
机与端口<port>
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- 要想在因特网上找到资源,应用程序要知道是哪台机器装载了资源,以及在那台机器的什么地方可以找到能对目标资源进行访问的服务器。URL 的主机和端口组件提供了这两组信息。
- 主机
<host>
:标识了因特网上能够访问资源的宿主机器。可以用主机名(如www.joeshardware.com),或者 IP 地址来表示主机名。 - 端口
<port>
:标识了服务器正在监听的网络端口。对下层使用了 TCP 协议的 HTTP 来说,默认端口号为 80。
3. 用户名<user>
和密码<password>
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- 很多服务器都要求输入用户名
<user>
和密码<password>
才会允许用户访问数据。FTP 服务器就是这样一个常见的实例。 - 举例:
-
ftp://ftp.prep.ai.mit.edu/pub/gnu
第一个例子没有用户或密码组件,只有标准的方案、主机和路径。如果某应用程序使用的 URL 方案要求输入用户名和密码,比如 FTP,但用户没有提供,它通常会插入一个默认的用户名和密码。比如,如果向浏览器提供一个 FTP URL,但没有指定用户名和密码,它就会插入 anonymous(匿名用户)作为你的用户名,并发送一个默认的密码(Internet Explorer 会发送 IEUser,Netscape Navigator 则会发送 mozilla)。 -
ftp://[email protected]/pub/gnu
第二个例子显示了一个指定为 anonymous 的用户名。这个用户名与主机组件组合在一起,看起来就像 E-mail 地址一样。字符“@”将用户和密码组件与 URL 的其余部分分隔开来。 -
ftp://anonymous:[email protected]/pub/gnu
在第三个例子中,指定了用户名(anonymous)和密码(my_passwd),两者之间由字符“:”分隔。
-
ftp://ftp.prep.ai.mit.edu/pub/gnu
4. 路径<path>
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- 路径
<path>
:说明了资源位于服务器的什么地方。路径通常很像一个分级的文件系统路径。 - 举例:http://www.joes-hardware.com:80/seasonal/index-fall.html ,这个 URL 中的路径为 /seasonal/index-fall.html。
- 路径通常都是服务器定位资源时所需的信息。但路径并不总能为资源定位提供足够的信息。有时服务 器还需要其他的信息。
- 可以用字符“/”将 HTTP URL 的路径组件划分成一些路径段(path segment)。每个路径段都有自己的参数
<params>
组件。
5. 参数<params>
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- 除上述信息外,很多方案需要更多的信息才能工作。
- 参数
<params>
:这个组件就是 URL 中的名值对列表,由字符“;”将其与 URL 的其余部分(以及各名值对)分隔开来。它们为应用程序提供了访问资源所需的所有附加信息。 - 举例:ftp://prep.ai.mit.edu/pub/gnu;type=d ,有一个参数 type=d,参数名为 type,值为 d。
- HTTP URL 的路径组件可以分成若干路径段。每段都可以有自己的参 数。比如: http://www.joeshardware.com/hammers;sale=false/index.html;graphics=true
6. 查询字符串<query>
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- 查询
<query>
:很多资源,比如数据库服务,都是可以通过提问题或进行查询来缩小所请求资源类型范围的。 - URL 的查询组件和标识网关资源的 URL 路径组件一起被发送给网关资源。基本上可以将网关当作访问其他应用程序的访问点。
- 除了有些不合规则的字符需要特别处理之外,对查询组件的格式没什么要求。按照常规,很多网关都希望查询字符串以一系列“名 / 值”对的形式出现,名值对之间用字符“&”分隔,比如:http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue
7. 片段<frag>
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- 片段
<frag>
:表示一个资源内部的片段。比如,URL 可以指向 HTML 文档中一个特定的图片或小节。 - 举例:http://www.joes-hardware.com/tools.html#drills ,片段 drills 引用了Web服务器上页面 /tools.html 中的一个部分,这部分的名字叫做 drills。
- HTTP 服务器通常只处理整个对象,而不是对象的片段,客户端不能将片段传送给服务器。浏览器从服务器获得了整个资源之后,会根据片段来显示你感兴趣的那部分资源。
- 服务器处理的是整个对象,因此URL片段仅由客户端使用。