全部的东西都有一个标准化的东西,公交有线路号,飞机有航班号,我的有身份证号,你坐出租车,告诉司机师傅我要到石牌华师,他就能明白你的意思了。URL就是因特网资源的标准化名称。URL指向一条电子信息片断,告诉你它们位于何处,以及如何与他们进行交互。html
统一资源标识符(Uniform Resource Identifier,URI)是一类更通用的资源标识符,它包括URL和URN。URL是经过描述资源的位置来标识资源的,而URN是经过名字来识别资源的,与它们当前所处的位置无关。算法
咱们普通时候遇到的大部分的URL(好比”http://soccer.hupu.com/germany“)是由三部分组成的:方案(http)、主机(soccer.hupu.com)、路径(/germany)。URL的语法随方案的不一样而有所不一样!大多数URL方案的URL语法都创建在由9部分构成的通用格式上:数组
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
不过几乎没有哪一个URL包含全部这些组件。浏览器
首先咱们来看看什么叫方案。安全
方案其实是规定如何访问指定资源的主要标识符,它会告诉负责解析URL的应用程序应该使用什么协议。咱们最经常使用的http(目前大部分浏览器都会帮你省略掉这个部分)、https(http的安全版)、ftp等等。服务器
方案名是不区分大小写的,也就是说”http://www.google.com“和”HTTP:www.google.com“是等价的(你能够去你的浏览器里去试一下)。并发
咱们要访问因特网上的资源,要知道是哪台机器装载了该资源,以及在该机器的什么位置能够找到该资源,这就是URL内主机与端口提供的信息。咱们能够用主机名(www.hupu.com)或者IP地址(112.90.32.241)来表示主机名。端口组件标识了服务器正在监听的端口,http的默认端口为80,https的默认端口为443。less
用户和密码组件一般出如今ftp协议中。网站
ftp://ftp.prep.ai.mit.edu/pub/gnu这个例子中没有用户和密码组件。当URL方案要求输入用户名和密码时,它会插入anonymous做为你的用户名,并发送一个默认密码。google
ftp://anonymous@ftp.prep.ai.mit..edu/pug...该例子中显示了一个指定的用户名anonymous。字符@讲用户和密码组件与URL的其余部分分隔开来。
ftp://anonymous:my_password@ftp.prep.ai....指定了用户名和密码,由”:”分。
就像PC中文件路径同样。每一个路径都有本身的参数。
URL中的参数组件是名值对列表,由字符”;”将其与URL的其余部分分隔开来。它们为应用程序提供了访问资源所须要的附加信息。ftp://ftp.prep.ai.mit.edu/pub/gnu;type=d
能看出上述例子中的参数名是什么,参数的值是什么吗?
咱们用一个例子来讲明http://bbs:scoccer.com/15630262.html?ite...。这个例子中?右边的内容就是查询组件。咱们经过查询组件来缩小所请求资源的范围。
咱们通常用“名/值”的方式来查询,名值对之间用&分隔:http://bbs:scoccer.com/15630262.html?ite...。
URL支持用片断组件来表示一个资源内部的片断,如HTML文档中一个特定的图片和小节。好比:
http://bbs:scoccer.com/15630262.html#rob...
*HTTP服务器处理整个对象,而不是对象的片断,从服务器返回的是整个资源后,由客户端的浏览器来显示你感兴趣的片断。
URL有两种方式:绝对的和相对的。咱们通常见到的都是绝对URL。而相对URL是URL的一种便捷缩略记法,是URL的片断或者一小部分。有过开发经验的应该也都见过。咱们来看一下一个HTML文档
<HTML> <HEAD><TITLE>Joe's Tools</TITLE></HEAD> <BODY> <H1>Tools Page</H1> <H2>Hammers</H2> <P>Joe's Hardware Online has the largest selection of <A HREF="./hammers.html">hammers</A> on the earth.</P> <H2><A NAME=drills></A>Drills</H2> <P>Joe's Hardware has a complete line of cordless and corded drills, as well as the latest in plutonium-powered atomic drills, for those big around the house jobs.</P> ... </BODY> </HTML>
其中 ./hammers.html就是一个相对路径。
既然说是相对路径,那它确定有个相对的对象。这个对象就是所谓的基础URL。这个例子中,基础URL是http://www.joes-hardware.com/tools.com。那么基础URL是怎么来的呢。
一、在资源中显示提供。好比HTML文档中可能会包含一个定义了基础URL的标记<BASE>
二、封装资源的基础URL。若是没有显式指定基础URL,能够将它所属资源的URL做为基础。
三、没有基础URL。一般意味这是一个绝对URL,固然也有可能这个URL是不完整的。
那么咱们如何将一个相对的URL转换为绝对的URL呢?咱们看下面这个图。
咱们对./hanmmers.html使用图中的算法。
1)路径为./hammmers.html,基础URL为http://www.joes-hardware.com/tools.html
2)方案为空,继承基础URL的方案(HTTP)
3)组件为空,继承主机和端口组件
4)将相对URL和继承的组件合并:http://www.joes-hardware.com/hammmers.ht...。
《HTTP权威指南》中说咱们在地址栏中输入yahoo,就会自动在主机名中插入www.和.com,不过目前我尚未找到对应的例子
这个咱们平常中用的不少了,经过咱们访问过的网站,浏览器会自动帮咱们提供一些完整的选项供咱们选择。
咱们已经知道URL提供的是咱们所需资源所处的位置,它的缺点是,一旦该资源被移走,咱们就不能经过URL对该资源进行定位了。咱们解决方案正式前面提到的URN。
URN(uniform resource name)统一资源名。其思想是在资源搜索的过程当中引入另一个中间层,经过一个中间资源定位符,服务器对资源的实际URL进行登记和跟踪,这样无论咱们的资源被移动到了何处,只要它没有被删除,定位符就能够以这个资源重定向到所请求资源的实际URL中去。不过想要取代URL还须要必定的时间,这也不是Web开发中的紧迫问题。