URL举例:
http://www.isdvfd.com:80/news/index.asp?name=zhangsan&age=28&job=12345#resume
目录
解说一:
协议
用来指明客户端和服务器之间通信的类型。我们经常用到的协议有四种:http、https、ftp 以及 file。这四种协议的使用场景如下表所示:
协议使用场景:
http(HyperText Transfer Protocol)----超文本传输协议。http协议可以将编码为超文本的数据从一台计算机传送到另一台计算机,不进行加密。
https(HyperText Transfer Protocol over SecureSocket Layer)---- 安全超文本传输协议。以安全为目标的 http 通道,安全网页,加密所有信息交换。
ftp(File Transfer Protocol)---- 文件传输协议。
file ---- 本机上的文件。
主机、主机名
主机名可以向浏览器提供文件站点的名称。www 是常见的服务器名,imailtone.com 是域名,www.imailtone.com 是主机名。
域名
域名和服务器名一起使用,被用来定义服务器的地址。Web 服务器遵守数字网络协议(Internet Protocol,IP),每一台连接到因特网的计算机都有一个固定的 IP 地址。域名即 IP 地址的别名,因为一般的 IP 地址都是长串的数字,为了方便记忆所以使用域名进行替代。简单来说,没有域名(IP)我们就不能上网。
端口名
如果不写,http 的默认端口号是 80,https 的默认端口号是 443,ftp 的默认端口号是 21。还是拿 C语言中文网举例说明,不论用户输入 http://c.biancheng.net/ 还是 http://c.biancheng.net/:80,浏览器都会解析为 C语言中文网的链接。
路径
指定远程服务器上文件所在的位置。就像自己在本地计算机上保存文件时所指定的文件夹一样,Web 服务器上的文件也可能存放于子目录中(就是文件夹中的子文件夹)。如果是这样,路径中的相邻文件夹需要使用斜线 / 隔开。例如 http://c.biancheng.net/view/views/7410.html 这个网址,它的路径就是 /view/views。
文件名
用来定义文档或资源的名称。和路径类似,路径指向的是文件夹,而它指的是文件夹中的文件。例如 http://c.biancheng.net/view/views/7410.html 这个网址,它的文件名就是7410.html 。
参数
从 ?开始到 # 为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为 name=tom&age=20&job=1573 。参数可以允许有多个参数,参数与参数之间用 & 作为分隔符。
锚
# 之后的部分称为锚部分。本例中的锚部分是 resume 。锚部分不是一个URL必须的部分。
注意:
协议需要与 URL 的其它部分用 :// 隔开。百度网址后面的.com以及 C语言中文网的.net又称作域后缀(扩展名),用于表明该主机所在的域的类型。
解说二:
协议
图中http://
这部分就是协议部分,即指定了URL是以什么协议发送网络请求的
常见的协议如:http://
、https://
、ftp://
、file://
,比如: http://
就是超文本传输协议,平时上网大多用这个协议,https://
是以安全为目标的HTTP协议。
地址
图中localhost
就是地址部分,用来确定URL所要访问的服务器的网络地址(也就是网址)。在URL中,地址可以用三个形式来表示:域名
、主机名
、IP地址
域名
我们平时输入的www.baidu.com
、www.qq.com
就是域名,域名也分一级域名
、二级域名
、以及顶级域名
。
- 顶级域名:在域名的尾巴部分,
.com
这种就是顶级域名
,顶级域名一般都代表网站属于某种机构或组织。像.com
(商业机构)、.org
(非盈利组织)、.gov
(政府机构)这类就是常见的顶级域名,除此之外,还有些代表国家的顶级域名,如:.cn
(中国)、.us
(美国)、.jp
(日本)等等 - 一级域名:像
qq.com
就是一级域名
,看上去十分简洁,在顶级域名.com
前只有一个单词短语 - 二级域名:而
mail.qq.com
和v.qq.com
这种前面加了mail.
、v.
等字符串的就叫二级域名
不过,域名也只是一串文字,计算机和路由器并不能直接认出它,还需要通过DNS
服务器找到域名对应的IP地址
,再通过底层的TCP/IP
协议路由到对应的机器上去。
主机名
主机名就是某台计算机的名字,在一个局域网内,可以通过主机名
找到你要访问的计算机。主机名和域名一样,计算机和路由器不认它,需要通过HOSTS文件
这样的技术找到主机名
和IP地址
的关联关系,最后还是翻译成IP地址
再继续发送网络请求,图中的localhost
也是主机名
,但是是一种比较特殊的主机名
,是给回环地址的一个标准主机名,就是代表本机自己的地址,在终端输入hostname即可查看本地主机名。
IP地址
在URL中也可以直接用IP地址
来代替域名或主机名,如192.168.0.1
,在终端输入ipconfig即可查看本地IP地址。
端口号
图中在冒号:
后面的那串数字8080
就是端口号,一台服务器上可以开多个端口号,往往一个网络服务程序就对应一个端口号。
比如,我在机器 A 上,开了两个服务程序,分别是 Tomcat
和SSH
,让它们分别关联端口8080
和22
,那URL中如果端口号是8080
就是会访问到Tomcat
程序,22
就会连接SSH服务。
但可能有小伙伴会有疑问:诶,我平时上百度看到的URL是http://www.baidu.com
没看到有端口号啊
其实是有的,端口号是80
,只是它被隐藏起来了,我们看不到而已,而这个80
端口也就是URL的默认端口号
但不是所有URL的默认端口号都是80
,如果协议是http://
,默认端口号为80
,但若是https://
协议,默认端口号就是443
了。
虚拟目录
从第一个斜杠/
开始,到最后一个斜杠/
结束的那部分,也就是图中/app/user/
那部分即为虚拟目录
它就类似我们电脑中文件目录的格式,第一个/
为根目录,每多一个/
就多进入一层目录。
文件名
从域名后开始算起的最后一个斜杠/
开始,到?
为止,没有?
则到#
为止,或者?
和#
都没有就是到整个URL结束为止的那部分就为文件名。
说起来很绕吧,其实就是图中 info.do
这部分,它一般包含文件名和扩展名('.'后面那部分),用来指代一个URL所访问的具体文件或资源,它可以是图片、html文件、css文件,也可以是js文件、字体文件等等,它也可以不是某种文件,而是服务端后台执行的某段程序。
甚至可以省略不写虚拟目录和文件名,因为它们本来就不是必须的,就如http://www.baidu.com
这样的URL就没有文件名,但服务器会在缺省的情况下给你定位到某个特定的文件或程序上去。
查询参数
从?
后到#
结束,即图中的?uid=101&ty=2
为查询参数。
查询参数,也称为URL参数、查询字符串,英文名为 Query
,它是用来向服务端以字符串的形式传递参数和少数数据用的。
其参数形式一般都以多个键值对
的形式进行表示,如 a=1
、b=2
就是两个键值对
,键为"a"和"b",值为对应的"1"和"2", 多个键值对
用&
连起来:a=1&b=2。
URL编码
但参数要传递的某些值往往带有特殊字符,这些字符和URL标准的格式冲突,比如要传a&b
这样字符串,和查询参数键值对的连接符&
冲突了,若不加以区分就会产生歧义。
而最简单的办法,就是对参数值进行编码,称为 URL Encoding,通过编码,a&b
变成了a%26b
,就不再包含会冲突的特殊字符。
而有些参数即便有特殊字符,也不会被编码,除非自行强制编码,比如URL中参数值是另外一串URL,就可以写成 http://localhost/do?url=http://www.baidu.com
这种特殊情况不会有歧义,因为计算机系统认得出参数是另一串URL,就会按URL的形式来解析,但当子URL又包含子参数和多子键值对的时候也难免会分不清参数到底是儿子的还是父亲的,这时还是强制编码的好
列表参数
URL的参数是一个个键值对,即一个key
对应一个value
,那如果是一个key
要传递多个值,也就是一个列表咋办?也好办。
URL的参数名是可以重复的,比如a=1&a=2&a=3
,这里穿了3个参数名都为a
的查询参数,是完全可以的,可以利用这种特性,按顺序将 1
、2
、3
作为参数a
的列表值。
为了表示更清楚点,一般都会在列表参数名后面加上一对方括号[]
,如:a[]=1&a[]=2&a[]=3
但是,对于URL参数的写法和格式的标准,也没有特别严格的规定,以上几种形式一般都会支持。
锚
图中#
后面那部分字符串,#abc
就是锚部分。
锚,英文称做Reference
,通常也是用来传递参数等信息,但与查询参数的本质区别就是这部分内容不会被传递到服务器端。
锚一般用于页面,比如在浏览网页的时候,按个按钮突然帮你定位到页首或页面中的某个位子去了,这就是锚。