一般我们在上网的时候都会在浏览器的地址栏中输入一个网站的“URL”,点击回车,它就会跳转到你想要的网站togoto,是这样的但实际上称其为“URL”并不是特别准确。准确的说,应该叫URL。什么是网址?什么是网址?不就是一个网址吗?URL是英文UniformResourceLocator的缩写,即UniformResourceLocator。那时候只要输入baidu.com或者qq.com就可以正常上网,但实际上我们输入的只是整个网址的一小部分。先来看看一个比较完整的URL的整体结构。分为几个部分,我们一一看,在协议图中它们具体是干什么的http://这部分是协议部分,即通用协议,规定了URL使用什么协议发送网络请求,如:http://、https://、ftp://、file://,例如:http://是超文本传输??协议,上网时多用到,而https://是一个以安全为目标的HTTP协议。在地址图中,localhost为地址部分,用于确定URL要访问的服务器的网络地址(即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也是一个主机名,但是一个特殊的主机名,是loopback地址的标准主机名,代表的是机器本身的地址。也可以直接在URL中使用IP地址代替域名或主机名,如192.168.0.1。关于IP地址的相关知识点后面会讲到(继续挖掘)。图中冒号后面的端口号:8080这一串数字就是端口号。可以在一台服务器上打开多个端口号。通常,一个网络服务程序对应一个端口号。比如我在机器A上开了两个服务程序,分别是Tomcat和SSH。它们分别与端口8080和22相关联。如果URL中的端口号是8080,会访问Tomcat程序,22会连接SSH服务。但是有的朋友可能会有疑惑:哎,我平时在百度上看到的网址是http://www.baidu.com,但是没有看到端口号。实际上,有一个端口号。端口号为80,但它是隐藏的。起来了,我们是看不到的,而且这个80端口是url的默认端口号,但是并不是所有的url都有默认的80端口号,如果协议是http://,那么默认的端口号就是80,但是如果是https://协议,默认端口号是443,虚拟目录从第一个斜杠/开始,到最后一个斜杠/结束,也就是图中/app/user/的部分虚拟目录,类似于我们电脑中文件目录的格式,第一个/是根目录,每多一个/就会进入额外的一层目录。文件名从域名后的最后一个斜杠/开始,以?结尾,如果没有?,就到Asfaras#,或者两者都不是?#也不是整个URL末尾的部分。文件名非常复杂。其实就是图片中的info.do部分,一般包括文件名和扩展名('.'之后的那部分),用来指代某个URL访问的具体文件或资源,可以是一张图片、html文件、css文件、js文件、字体文件等等,也可以不是某个文件,而是服务器后台执行的一个程序。您甚至可以省略虚拟目录和文件名,因为它们不是必需的。比如像http://www.baidu.com这样的网址是没有文件名的,但是服务器默认会定位你到特定的文件或程序。查询参数从哪里开始?以#结尾,即图中的?uid=101&ty=2是查询参数queryparameter,又称URL参数,查询字符串,英文名称是Query,是用来发送字符串的形式传递的参数和少量数据一般以多个键值对的形式表示。例如a=1和b=2是两个键值对,键分别是“a”和“b”。值对应“1”和“2”,多个键值对用&:a=1&b=2URL编码连接,但有些要传参的值往往带有特殊字符,与URL标准格式,比如你要传递a&b这样的字符串,与查询参数键值对的连接符&冲突。不区分就会有歧义。最简单的方法是对参数值进行编码,这称为URL编码。通过编码,a&b变成了a%26b,不再包含会冲突的特殊字符,有些参数即使有特殊字符也不会编码,除非自己强制编码,比如url中的参数值为又一串url,你可以在http://localhost/do?url=http://www.baidu.com这种特例中没有歧义,因为计算机系统识别该参数是另一串url,它将以URL的形式解析它。但是,当子URL中包含子参数和多个子键值对时,难免难以区分参数是属于儿子还是属于父亲。这时候最好强制编码。列表参数URL的参数是键值对。即一个key对应一个value,那么如果一个key需要传递多个value,也就是一个list呢?url的参数名可以重复也好办,比如a=1&a=2&a=3,完全可以使用三个参数名都是a的查询参数,可以利用这个特性来替换1依次,2,3作为参数a的列表值。为了表达更清楚,一般在列表参数名后加一对方括号[],如:a[]=1&a[]=2&a[]=3但是,对于URL并没有特别严格的规定关于参数的写法和格式。以上形式一般都支持锚图中#后面的字符串部分。#abc是锚点的锚点部分。英文称为Reference,通常用于传递参数。等信息,但与查询参数的本质区别是这部分内容不会传递给服务器。锚一般用于页面。例如,在浏览网页时,突然按下一个按钮可以帮助您定位到页面顶部或页面的某个部分。座位没了,这就是主播现在随着前端分离技术,尤其是vue、reactjs等前端框架的兴起,主播被用作前端javascript程序处理的参数载体也越来越重要。结语URL看似是一件很简单的东西,已经习以为常了,但是背后往往隐藏着很多技术细节和知识点。即使是这篇短文也无法穷尽URL。内容还挺多的,比如
