概述
- URL :统一资源定位符(Uniform Resource Locator)
- 中文译为网址
https://www.example.com/path/index.html
网址的组成部分
URL 由多个部分组成;下面是一个比较复杂的 URL,实际的 URL 通常不会有这么多部分
https://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#anchor
协议
协议(scheme)是浏览器请求服务器资源的方法,上例是https://
的部分,表示使用 HTTPS 协议。
互联网支持多种协议,必须指明网址使用哪一种协议,默认是 HTTP 协议。也就是说,如果省略协议,直接在浏览器地址栏输入www.example.com
,那么浏览器默认会访问http://www.example.com
。HTTPS 是 HTTP 的加密版本,出于安全考虑,越来越多的网站使用这个协议。
HTTP 和 HTTPS 的协议名称后面,紧跟着一个冒号和两个斜杠(://
)。其他协议不一定如此,邮件地址协议mailto:
的协议名后面只有一个冒号,比如mailto:[email protected]
。
主机
主机(host)是资源所在的网站名或服务器的名字,又称为域名。上例的主机是www.example.com
。
有些主机没有域名,只有 IP 地址,比如192.168.2.15
。这种情况常常出现在局域网。
端口
同一个域名下面可能同时包含多个网站,它们之间通过端口(port)区分。“端口”就是一个整数,可以简单理解成,访问者告诉服务器,想要访问哪一个网站。HTTP 协议的默认端口是80,如果省略了这个参数,服务器就会返回80端口的网站。
端口紧跟在域名后面,两者之间使用冒号分隔,比如www.example.com:80
。
路径
路径(path)是资源在网站的位置。比如,/path/index.html
这个路径,指向网站的/path
子目录下面的网页文件index.html
。
互联网的早期,路径是真实存在的物理位置。现在由于服务器可以模拟这些位置,所以路径只是虚拟位置。
路径可能只包含目录,不包含文件名,比如/foo/
,甚至结尾的斜杠都可以省略。这时,服务器通常会默认跳转到该目录里面的index.html
文件(即等同于请求/foo/index.html
),但也可能有其他的处理(比如列出目录里面的所有文件),这取决于服务器的设置。一般来说,访问www.example.com
这个网址,很可能返回的是网页文件www.example.com/index.html
。
查询参数
查询参数(parameter)是提供给服务器的额外信息。参数的位置是在路径后面,两者之间使用?
分隔,上例是?key1=value1&key2=value2
。
查询参数可以有一组或多组。每组参数都是键值对(key-value pair)的形式,同时具有键名(key)和键值(value),它们之间使用等号(=
)连接。比如,key1=value
就是一个键值对,key1
是键名,value1
是键值。
多组参数之间使用&
连接,比如key1=value1&key2=value2
。
锚点
锚点(anchor)是网页内部的定位点,使用#
加上锚点名称,放在网址的最后,比如#anchor
。浏览器加载页面以后,会自动滚动到锚点所在的位置。
锚点名称通过网页元素的id
属性命名,详见《元素的属性》一章。
URL 字符
URL 组成
- 26个英语字母(包括大写和小写)
- 10个阿拉伯数字
- 连词号(
-
) - 句点(
.
) - 下划线(
_
)
URL 保留字符
-
URL有18个保留字符,只能在给定的位置出现
-
比如,查询参数的开头是问号(
?
),也就是说,问号只能出现查询参数的开头,出现在其他位置就是非法的,会导致网址解析错误 -
网址的其他部分如果要使用这些保留字符,必须使用它们的转义形式。
URL 字符转义的方法
- 在这些字符的十六进制 ASCII 码前面加上百分号(
%
)
#在python中查询ASCLL码
ord("#")
#在python中查询16进制
hex(35)
:%20 |
* :%2A |
|
---|---|---|
! :%21 |
+ :%2B |
@ :%40 |
" :%22 |
, :%2C |
[ :%5B |
# :%23 |
/ :%2F |
] :%5D |
$ :%24 |
: :%3A |
|
% :%25 |
; :%3B |
|
& :%26 |
= :%3D |
|
' :%27 |
? :%3F |
|
( :%28 |
||
) :%29 |
foo?bar.html |
foo%3Fbar.html |
---|
合法字符也可以转义 | |
---|---|
``www.apple.com| www.%61pple.com` |
- 既不属于合法字符、也不属于保留字符的其他字符(比如汉字),理论上不需要手动转义,可以直接写在 URL 里面
www.example.com/中国.html |
www.example.com/%e4%b8%ad%e5%9b%bd.html |
---|
绝对 URL 和相对 URL
URL 分成两种:绝对 URL 和相对 URL。
绝对 URL 指的是,只靠 URL 本身就能确定资源的位置。这意味着,URL 必须带有资源的完整信息,包含协议、主机、路径等部分。前面的例子都是绝对 URL。
相对 URL 指的是,URL 不包含资源位置的全部信息,必须结合当前网页的位置,才能定位资源。比如,当前网页的 URL 是https://www.example.com/path/index.html
,该网页上面有一个资源,URL 指向a.html
,这个就是相对 URL。因为只知道a.html
,并不能定位资源。浏览器假定,a.html
与当前网址在同一个子目录下面,从而得到绝对 URL https://www.example.com/path/a.html
。
相对 URL 如果以斜杠(/
)开头,就表示网站的根目录。否则,必须以当前目录为起点,推算资源的位置。比如,相对 URL /foo/bar.html
表示网站根目录的子目录foo
,foo/bar.html
表示在当前目录的foo
子目录。
URL 还可以使用两个特殊简写,表示特定位置。
.
:表示当前目录,比如./a.html
(当前目录下的a.html
文件)..
:表示上级目录,比如../a.html
(上级目录下的a.html
文件)
这两种简写可以多个连用,比如../../
表示上两级目录。
绝对 URL 也可以使用这两个简写,比如www.example.com/./index.html
等同于www.example.com/index.html
,这时.
相当于根目录的当前目录,即根目录本身。
<base>
<base>
标签指定网页内部的所有相对 URL 的计算基准。整张网页只能有一个<base>
标签,而且只能放在<head>
里面。它是单独使用的标签,没有闭合标签,下面是一个例子。
<head>
<base href="https://www.example.com/files/" target="_blank">
</head>
<base>
标签的href
属性给出计算的基准网址,target
属性给出如何打开链接的说明(参见《链接》一章)。已知计算基准是https://www.example.com/files/
,那么相对 URL foo.html
,就可以转成绝对 URL https://www.example.com/files/foo.html
。
注意,<base>
标签必须至少具有href
属性或target
属性之一。
<base href="http://foo.com/app/">
<base target="_blank">
一旦设置了<base>
,就对整个网页都有效。如果要改变某个链接的行为,只能用绝对链接替代相对链接。尤其需要注意锚点,这时锚点也是针对<base>
计算的,而不是针对当前网页的 URL。