本篇博客旨在厘清 URI 、 URL 、 URN 之间的关系。
IETF(互联网工程任务组—The Internet Engineering Task Force)是松散的、自律的、志愿的民间学术组织,成立于1985年底, 其主要任务是负责互联网相关技术规范的研发和制定。
WHATWG 网页超文本技术工作小组,是一个以推动网络HTML 5 标准为目的而成立的组织。
RFC 征求意见稿,是由 IETF 发布的一系列备忘录。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件,以编号排定。
其中,WHATWG 的建议是——我们要大一统那些写的烂的 RFC 规范。另外,URL 和 URI 两个概念太麻烦了,所以大家都别用 URI 了,都用 URL 就好。
但我们要想到一点,WHATWG 的建议是因为它们工作性质是 网页 小组。他们希望凡是 Web 技术的发展都必须遵循我们浏览器厂商的事实标准,不然你规范写的再好也没有用。 另外,尽管写在 href 属性中的内容是 URL,但浏览器发送的 HTTP 请求首行中的内容是 URI,哪怕它们(不考虑 HTTP 非 Proxy 请求会把 Host 单独写 Header 里的情况下)完全一样(在各自独立的规范中的定义里)也是两个东西。
这里在本人看来 WHATWG 的规范是值得商榷的。
我们再来看看 IETF based 协议规范中的定义:
URI: uniform resource identifier 统一资源标识符
URL: uniform resource locator 统一资源定位符
URN:Uniform Resource Nam 统一资源名称
由以上命名大抵可以看出这几个本身的区别。URI是用来标识资源的,而 URL 和 URN 则是该资源的部分信息,所以可以说 URL 和 URN 都属于 URI的子集。
也可以这样理解, URI 是给该资源下个定义(起个名字,贴个表签),它包含的资源本身的一些属性,但你是不知道该资源在哪里的。URL则即包含其属性,也包含其位置信息。 或者更加直观的根据功能的理解就是 URI 只定义资源,而 URL 只用来找到该资源。
URI详解 ======================================
URI是一种更宏观层次上的概念,用于指定标识Web资源的字符串的各个不同部分, 其本身是以某种统一的(标准化的)方式标识资源的简单字符串,一般由三部分组成:
1.访问资源的命名机制; 2.存放资源的主机名; 3.资源自身的名称,由路径表示
典型情况下,这种字符串以 scheme 开头,语法如下:
[scheme:] scheme-specific-part
举例: goodle.com 其中 http 是 scheme,//google.com 是 scheme-specific-part, 并且它的 scheme 与 scheme-specific-part 被冒号分开了。
有的URI指向一个资源的内部。这种URI以”#”结束,并跟着一个anchor标志符(称为片断标志符)。
相对URI不包含任何命名规范信息。它的路径通常指同一台机器上的资源。相对URI可能含有相对路径(如:“..”表示上一层路径),还可以包含片断标志符。
设计 URI 应该遵循的规则:
URI 是网站UI的一部分,因此,可用的网站应该满足这些 URL 要求
简单,好记的域名
简短(short)的 URI
容易录入的 URI
URI 能反应站点的结构
URI 是可以被用户猜测和hack的(也鼓励用户如此,但不可暴露服务器等技术方面的信息)
永久链接,Cool URI don’t change
URL 和 URI 对比
二者的区别在于,URI表示请求服务器的路径,定义这么一个资源。而URL同时说明要如何访问这个资源(http://)。
例如,一个URL通常包括三部分:
方案部分(scheme):http://
| 地址部分:CEALER | 一些瞬间、一些回忆、一些经典、一些原创、一些愤怒、一些感动 |
资源部分:/1.png
而在C#中,URL类属于System.Security.Policy命名空间,Uri属于System。在MSDN对Url类的备注中,能更好的说明Url与Uri的区别:
Url 证据的存在将在授予集内生成 UrlIdentityPermission。如果有对 UrlIdentityPermission 的 Demand,则与 Url 证据对应的 UrlIdentityPermission 将与请求的权限进行比较。
考虑完整的 URL,包括协议(HTTP、HTTPS、FTP)和文件。例如,Microsoft Home Page 就是一个完整的 URL。
URL 可以精确匹配,也可在最后一个位置使用通配符来匹配。例如,Microsoft Home Page* 就是一个含通配符的 URL。
而Uri类在实例化的时候,可以指定为绝对路径,相对路径,但可以不指定到具体的某个资源。
那么我理解的二者的区别就是:
URI可以表示一个域,也可以表示一个资源。
URL只能表示一个资源。
同样的,URN(统一资源名称)也是URI的一个子集,目前没有大规模运用。
PS:
URI是一个字符串格式规范 并没有指定它的用途
URL是资源定位的规范 包括网址 ftp服务器 文件路径
总结:
个人理解 URI 更多的是一个抽象的概念,一种文档的规范,而该规范其实就是给某个资源进行命名,以在需要的时候进行规范的使用(解析)等。
而 URL 则提供一种更加具体的类似与索引的功能,通过 URL 就直接找到了 该资源。当然,这里其实已经暗含了该资源已经通过了解析得到,然后才是定位找到。