转载请注明出处:
本文出自:NiZhuanXingHe的博客
概述
每一个服务器资源都有一个名字,服务器的资源名被称为 统一资源标识符 ——URI,URI有两种形式,分别是URL(统一资源定位符)和URN(统一资源名),目前,URL被使用的很广泛。
URL
可以这么说,URL是web客户端向web请求信息时所需的资源位置,通过url,web客户端可以获取到数据资源。
1、URL的语法
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
<方案>://<用户>:<密码>@<主机>:<端口>/<路径>;<参数>?<查询>#<片段>
- 方案:访问服务器获取资源所使用的协议,如:http、ftp
- 用户:访问资源的用户名
- 密码:用户名后可能包含的密码
- 主机:资源宿主服务器的主机名或ip地址
- 端口:资源宿主服务器正在监听的端口号,默认为 80
- 路径:服务器资源本地名,由斜杠(/)与前面URL组件分隔开
- 参数:相互之间,以及与URL前面组件由分号(;)分隔开
- 查询:用问号(?)与URL其余组件分隔开
- 片段:一小片或者一部分资源名字。引用对象时,不会讲frag传给服务器;这个值在客户端内部使用。通过字符(#)将其与URL的其余部分分隔开来
1.1、主机和端口
http://www.joes-hardware.com:80/index.html
http://192.0.0.168:80/index.html
这两个url,前者是主机名:端口,后者是ip地址:端口。若是主机名,则需要通过DNS得到主机ip地址,之后才能访问。
1.2、用户名和密码
ftp://ftp.prep.ai.mit.edu/pub/gnu
ftp://cwb@ftp.prep.ai.mit.edu/pub/gnu
ftp://cwb:cwbpassword@ftp.prep.ai.mit.edu/pub/gnu
http://cwb:cwbpassword@www.cwb-guitar.com/sales_info.txt
第一个例子没有用户或密码组件,只有标准化方案(ftp:文件传输协议)、主机(ftp.prep.ai.mit.edu)和路径(/pub/gnu);
第二个例子指定了一个用户名(cwb);
第三个例子用户名(cwb)和密码(cwbpassword)之间由字符":"隔开;
第四个例子则包含用户名和密码,标准化方案为http。
1.3、路径
url路径说明了资源位于服务器的具体位置,如:
http://www.jjjjj.com:80/aaa/bbb/index-a.html
其中“/aaa/bbb/index-a.html”就是这个url的路径。
1.4、参数
对于很多方案来说,仅仅通过方案名、主机、端口、用户名、密码和路径仍不能完成工作,还需要提供更多的信息。负责解析url的应用程序需要这些协议参数来访问资源并提供正确的服务。
ftp://prep.ai.mit.edu/pub/gnu;type=d
ftp://www.cwbftp.com/aaa;param1=false/index.html;param2=good
第一个例子中,有一个参数type=d,参数名是type,值为d;
第二个例子中,url有两段路径,每段路径又一个参数,分别是param1,值为false,param2,值为good。HTTP URL的路径组件可以分成若干路径段。
1.5、查询字符串
查询字符串用于缩小请求资源的范围:
http://www.abc.com/check-data?page=2
http://www.abc.com/check-data?page=2&level=0
上面例子中,诸如“age=2”这样的字段就是查询字符串,与其他URL组件以(?)隔开。查询字符可以有多组名值对,它们以&隔开。
1.6、片段
http://www.abc.com/doc.html#chapter1
这个url中,用(#)与前段隔开的字符chapter1就是片段,客户端不会将片段传送给服务器,所以请求服务器资源时获取的会是的整个doc.html内容,但是收到这些数据资源后,客户端本地会以碎片过滤得到chapter1部分内容。
2、URL快捷方式
Web客户端可以理解并使用几种URL快捷方式:相对URL和URL自动扩展。
2.1、相对URL
URL有两种方式,相对和绝对。绝对URL中包含访问资源所需的全部信息;而相对URL则是一种便捷缩略的不完整记法。
相对URl必须相对一个基础URL进行解析,才能获得完整的URL。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>相对url实例</title>
<base href="https://www.guitar.com/">
</head>
<body>
<a href="/data/postguitarsheet">上传吉他谱</a>
</body>
</html>
如上面的html代码所示,在head下的base标签中href的值"https://www.guitar.com/",就是一个基础URL,body下的a标签的href的值是一个相对URL,它是合法的,但需要和基础url对比和解析,得到一个完整URL,即绝对URL,“https://www.guitar.com/data/postguitarsheet”。这里是去掉’/'拼接就可以,但有时候不需要去除其他部分,可直接拼接在一起,成为一个完整的URL。
上面的例子给出了显示提供的基础URL,但有时是不会显示提供,而是封装起来。这个时候的基础URL需要经过推导才能得到。有些情况下,基础URL也不会被给出。
将相对URL转换成绝对URL的过程:
上面的这张图,是基础URL和相对URL的所有组件拆开,进行比较判断,最后经处理,将相对URL合成绝对URL。
这种方法或函数在很多语言中是被官方提供的,如java:
URL baseUri = new URL("http://www.enet.com.cn/enews/inforcenter/designmore.jsp");
URL absoluteUri = new URL( baseUri, "../test.html");
absoluteUri.toString();
2.1、自动扩展URL
当你向浏览器输入一个不完整的URL,浏览器会帮你自动扩展一个完整路径,通过两种方式:
-
主机名扩展:比如你在浏览器地址栏输入"baidu",浏览器会构建出"www.baidu.com",如果匹配不到,会尝试换几种方式扩展。
-
历史记录扩展:浏览器会存储用户访问历史,当你输入一条语句,它会在历史记录中匹配。
3、URL字符
URL满足以下三个特性:
- 可移植的:统一命名因特网上所有资源,并可通过任意因特网协议安全传输。
- 可读的:可见、可打印;
- 完整的:那么信息不能丢失。但有些协议会剔除一些特定字符,所以URL只能使用较小的、安全的、通用的字母表中的字符,并将不安全字符转义成安全字符,再进行传输。
3.1、字符集
URL使用US-ASCII字符集,但US-ASCII很通用,并不能支持各种国家民族语言中的常见变体字符,所以URL集成了转义序列,通过转义序列,就能US-ASCII字符集的有限子集对任意字符或数据进行编码,包括二进制数。
3.2、URL编码
就是一种转义编码,将URL中的不安全字符转义成安全的字符组合。
格式:一个百分号(%),后面是两个ASCII的十六进制数。
字符 | ASCII码 | 示例 |
---|---|---|
空格 | 32(0x20) | http://www.abd.com/dog%20waste.html |
~ | 126(0x7E) | http://www.abd.com/%7Edogwaste.html |
3.3、URL字符限制
4、Web方案
Web方案有很多:
- http:超文本传输协议;
基本格式:
http://<host>:<port>/<path>?<query>#<frag>
示例:
http://www.jitashe.org/artist
- https:http+ssl;
基本格式:
https://<host>:<port>/<path>?<query>#<frag>
示例:
https://www.baidu.com/cache/sethelp/help.html
- ftp:文件传输协议
基本格式:
ftp://<user>:<password>@<host>:<port>/<path>;<params>
示例:
ftp://nzxh:123456@guitar.com:80/sheet/page1;type=classic
- file:指定一台主机上可直接访问的文件;
基本格式:
file://<host>/<path>
示例:
file://myhost/document/index.html
- news:用于访问一些特定的文章或新闻组;
基本格式:
news:<newsgroup>
news:<news-article-id>
示例:
news:rec.arts.starpage
- telnet:用于访问交互式业务,它不是对象本身,而是可以通过telnet协议访问的交互式应用程序;
基本格式:
ftp://<user>:<password>@<host>:<port>/
示例:
ftp://nzxh:123456@guitar.com:80/
- mailto: Mailto URL指向的是E-mail地址,因特网E-mail地址的语法记录在RFC-822中;
基本格式:
mailto:<RFC-822-addr-spec>
示例:
mailto:aaaaa@163.com
- rtsp/rtspu:RTSP URL是通过实时流传输协议(Real Time Streaming Protocol)解析的音/视频媒体资源标识符
基本格式:
rtsp://<user>:<password>@<host>:<port>/<path>
rtspu://<user>:<password>@<host>:<port>/<path>
示例:
rtsp://nzxh:123456@guitar.com:80/sheet/page1
总结
未来,URL还会被改进。