深入理解URL

我们几乎每天都要接触URL,但如果让你清楚地解释一下URL,我想很多人都只能支支吾吾,模棱两可,觉得差不多就行了,但我无法接受这样子。我从网上找了很多文章,想厘清URL的方方面面,但很多文章都是东拼西凑,缺乏权威性。所以我决定从最权威的两份文档入手来理解URL,一份当然是RFC1738,另一份是Wikipedia URL条目。下文其实是我对Wikipedia URL中的简单翻译。

URL,Uniform Resource Locator,统一资源定位符,俗称的网络地址(colloquially termed a web address), 是对某个网络资源的引用,这个引用指定了该资源在网络中的位置,并且指定了获得该资源的机制。

URL是一种特殊类型的URI(Uniform Resource Identifier,统一资源标识符), 虽然很多人认为URL和URI是通用的。 URL指明了获取该资源的方法,用一个协议或者读取机制来表示, 而并不是每个URI都是这样。所以说 http://www.example.com 是一个URL, 但www.example.com并不是。 URL通常用来引用一个网页(http),但它也可以用来作为文件传输(ftp), 邮件(mailto),数据库连接(JDBC), 和其他应用。

几乎所有的浏览器都会把一个网页的URL显示在它的地址栏。一个典型的URL有如下格式: http://www.example.com/index.html, 其中http指定了协议, www.example.com指定了主机名(hostname), index.html指定了文件名。

URL是由互联网之父Tim Berners-Lee 和IETF1994年在RFC1738中定义的。 URL的格式结合了已存在的域名系统(domain names)和文件路径语法跟文件名,其中slash(/)被作为路径分隔符,而服务器名可以当完整文件路径的前缀并以双slash(//)开始这一约定是之前就已经存在。

Berners-Lee后来曾经表示过后悔用了dots(.)来做URL的域名分隔符,他宁愿从头到尾都是用slash(/),他还表示用colon(:)来跟随URL的第一个字段(scheme)后,其实域名前面的双斜杠(//)是多余的了。

每一个HTTP URL都遵循了URI的语法,一个通用的URI格式如下:
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

它由以下几个部分组成:
1. Scheme, 由字符串组成,可以包含数字,加号(+), 点(.),或者横线(-)。虽然schemes是大小写敏感的,但权威来说,应该都用小写。跟在scheme后面的是冒号(:)。 常见的scheme有http(s),ftp, mailto,file,data, 和irc。
2.双斜杠(//): 对有些scheme来说双斜杠是必须的,有些不是。当权限部分(authority)为空时,path部分不能以双斜杠开始。
3.authority: 可选的,由以下部分组成:

用户名(user name)和密码(password)组成,中间以冒号(:)隔开,紧接着跟在后面是@。
主机,可以是主机名,也可以是ip(IPv4用.分隔,IPv6必须用[ ]包起来)
端口,可选,前面用冒号(:)跟主机分开

4.path,路径,通常是为层级的形式,用斜杠(/)来分隔。path一般都会映射成一条文件系统的路径。 如果该URL含有authority部分,则Path必须以斜杠(/)开始,但不能以双斜杠开始(//)。

5.Query,查询,可选,用问号(?)来跟前面部分分隔开,包含了查询字符串。它的格式没有严格定义,但一般都是用key=value的键值对来表示,并用&来分隔。

6.Fragment,段落,可选,用hash(#)来跟前面部分分隔开。Fragment包含了一个段落标识符指向一个次级的资源。比如,如果主资源是一份HTML文档,那么,fragment一般是一个HTML文档中一个特定元素的ID,浏览器会滚动到这个元素去。

comments powered by Disqus