URI和URL的区别

CSS 2013年05月19日 , , , , ,

URL URI

URIURL与URN的关系。

1. 背景

常常提到的World Wide Web(WWW)技术归纳起来是结合了三种技术在里面,即,数据格式、协议和将两者联系在一起的标识符。

  • 数据格式如:HTML和XML等。
  • 协议如:HTTP,FTP等。
  • 比如:URL,URI,URN等。

但是第三者,即将两者在联系在一起的标识符是比较广泛而抽象的。URI与URL、URN的关系如顶图所示。

下面主要介绍URI与URL。

2.URL与URI

定义:

  • URI(Universal Resource Identifiers) 统一资源标识符, RFC 文献1630中定义了它详细的规范(1994年6月)。
  • URL(Uniform Resource Locators) 统一资源定位符,RFC文献1738中定义了它详细的规范(1994年12月)。

而这两种规范是由RFC(Request For Comments)进行了说明,RFC文档是一系列关于Internet(早期为ARPANET)的技术资料汇总,于1969年开始发布。它制定了我们很多常见和不常见的Internet的各种文字资料和规范。

3.URI规范

按照URI的规范,URI一般由下面三部分组成:

在URI的规范中,资源描述文字,只允许使用字母,数字,安全字符,特殊字符,和转义字符。

Pic1

URI部分文档

转义字符在URL中规定是使用%两个hex进行表示,所以也就是为什么浏览器的form post会自动进行转义成%xx的关系而不使用unicode常用的%uxxxx(同时ECMAScript v3也不推荐在js中使用escape)。

但是值得注意的是在URI中,空格是作为保留字的,所以URI规范中空格被辅以一个快速标记符号(short hand notation)来进行标识,就是我们看到的+号。所以在php中提供的urlencode方法是为了把字符串转换成URI规范用的, 保留空格转换成+号,可以模拟出浏览器form post的结果。

4.URL规范

pic2

URL部分文档

URL 其实是 URI 中的一个子集,URI是一个很宽泛的定义,而且也在URI的基础上做了自己的特殊规范,例如

另外URL中把#规定成锚点是用来定位使用,使用了URI规定的保留字中的一个字符。

当然URL的escape也遵循了URI的规范使用%两个hex的格式。

pic3

URL部分文档

值得注意的是URL的保留字和URI是不一样的,这些字符都是有特殊意义的

有没有注意到空格没有在里面?在URL规范中,空格只是认为不安全(unsafe)的存在,因为可能会因为排版和打印关系,可能会被忽略,所以URL中是需要把空格转换成%20的。对应的php提供的rawurlencode 方法是用来把字符串转换成URL的标准。

JS中的encodeURI和encodeURIComponent 对字符的转义,虽然也是按照URI规范转义,但是它并没还有转换空格成+号,而是%20,后者会把URI的保留字; : / ?也进行转义。为什么浏览器和流行的server遇到 “ “,%20,+ 都会转换成空格?其实是为了更好兼容URI标准。

其实很多流行的http server都已经根据标准自动把url进行decode后给到后面的CGI进行处理,而我们自己的server很多时候需要开发来对这些进行decode。如果对这些标准不了解就很容易在decode的时候使用错误的decode手段。

而unicode目前使用场景最多的是在我们的脚本语言和页面展示中,为了支持更宽的字符集,用一种统一的编码来规范处理文字而使用, 浏览器会根据资源的定义(charset) 对目标的文字先进行unicode转义后再进行统一的处理,这样就可以保证一个utf-8 的页面也可以同时支持请求GB2312的资源,而不会因此显示出错。

除了URI和URL以外,还有一个不太流行的URN(Uniform Resource Name), 有兴趣的可以自己研究,它同样也是属于URI的子集。

5.思考

  1. 考虑一个既可以用file:/www/lab/访问也可以用http://furzoom.com/lab/访问的目录。通常,当通过文件系统访问文档时,您可能希望这些引用像#part2那样扩展为file:/www/lab/#part2;而通过HTTP访问文档时,您可能希望 #part2 扩展为http://furzoom.com/lab/#part2。这样是否与规范矛盾呢?怎么来解释?
  2. http://furzoom.com/lab/index.html是URL吗?
  3. 但一些简短的这类形式表示的是什么呢?比如www.furzoom.com/lab/,它也是一个URL吗?
  4. ../lab/index.html是什么呢?
  5. lab/index.html#url又是什么呢?

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《URI和URL的区别》
日志链接:http://furzoom.com/uri-url-distinction/
博客名称:枫竹梦

【上一篇】
【下一篇】

Trackbacks/Pingbacks

  1. php实现MVC | 可维博客
  2. php实现MVC - 有Bug

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部