URI

URI 是 Uniform Resource Identifier 的缩写。

Uniform

  • 统一不同类型的资源。比如 txtmp3jpeg 等不同的类型的资源都可以使用 URI 来标识
  • 统一不同协议。比如 httpftpmailto 等不同的协议都可以使用 URI 来标识
  • 统一新旧资源。引入新资源不会影响已有资源

Resource

官方定义没有对资源的范围做任何限制,所以任何被 URI 标识的东西都可以叫做资源。

常见的例子有电子文档、图片、固定用途的信息(比如今天 Los Angeles 的天气预报)、一项服务(比如 HTTP-to-SMS 网关)或者是一组资源。一个资源不一定需要能通过互联网访问,比如一个组织和图书馆中的一些书也可以是资源。抽象的概念也可以是资源,比如某些关系(比如雇佣关系或者婚姻关系)。

Identifier

从其他资源中区分一个资源,无论用什么手段实现(比如名称、地址)。标识符可以是 ID,但也可以不是,所以不要将标识符与 ID 等价。

语法规则

由 协议、authority、path、query 和 fragment 组成

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part   = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty

协议必填且不能为空,路径必填但可以为空。Authority 不是必填,但如果填写了要以 // 开头。

abempty 的意思是 absolute or empty

两个示例:

foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
协议 authority path query fragment
| _____________________|__
/ \ / \
urn:example:animal:ferret:nose

协议

为了 robustness,协议是大小写不敏感的(比如 HTTPhttp 是一样的),但为了一致性,只应该使用小写来表示协议。常用的有:http、https、ftp、mailto、file、data 和 irc。

Authority

很多 URI 协议都包含一个用于命名 authority 的分级元素,所以 URI 的路径会指向 authority 对应的命名空间。

Authority 以 // 开头,以下一个 /?# 或者 URI 的结尾而结尾。

语法如下:

authority   = [ userinfo "@" ] host [ ":" port ]

这里不描述 userinfo,因为很少用到。

host 语法如下:

host        = IP-literal / IPv4address / reg-name

host 同样是大小写不敏感,但为了一致性也要使用小写表示。

  • IP-literal:使用 IPV6 以及之后版本的 IP 地址,要使用 [] 包裹

  • IPv4address:使用点分十进制表示

      IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
    
    dec-octet   = DIGIT                 ; 0-9
    / %x31-39 DIGIT ; 10-99
    / "1" 2DIGIT ; 100-199
    / "2" %x30-34 DIGIT ; 200-249
    / "25" %x30-35 ; 250-255
  • reg-name:点分字符串,字符串可以是字母或者 -

可以看出 IPv4address 和 reg-name 并没有很明显的区分。所以为了区分这两者,采用 "first-match-wins" 算法:如果 host 匹配 IPv4address的规则,那它是一个 IPv4address 而不是 reg-name。

路径采用与文件系统一样的路径表示方式,以 / 分割。设计者这样说:

The relative URI syntax is just unix pathname syntax reused without apology.[2]

PS:设计者后悔采用 // 的设计,因为这个太笨拙了[2],从使用情况就可以看出,一般我们都不会用到 // 而是直接输入 // 后面的部分(比如输入 www.google.com 而不是 //www.google.com)。

URI、URL 和 URN

"Uniform Resource Locator" (URL) 是 URIs 的一个子集,提供一种定位资源而不是标识资源的方法。"Uniform Resource Name" (URN) 被用来指 "urn" 协议的 URIs 和其他通过名称属性定位的 URIs[1, 3]。

PS:关于 URL 的疑惑:上面说 URL 是定位而不是标识,但是 URI 中的 Identifier 就是标识符的意思,这不矛盾吗?

人们实际使用中也没有很明显的区分 URI 和 URL。普通用户都是说 URL,程序员混用 URL 和 URI,甚至连 RFC 中也是混用这两者(比如 "URI Syntax" (RFC 2396)、"Registration Procedures for URL Schemes" (RFC 2717))。

所以,综合各种情况,可以这样使用:

  • 如果资源会同时用 URL 和 URN 表示,那么使用 URI
  • 如果资源只用 URN 表示,那么用 URN,因为 URN 特殊并且少见
  • 如果资源只用 URL 表示,那么可以用 URL 或 URI,但是确定后最好统一使用而不是混用这两者

参考

  1. rfc3986
  2. https://www.w3.org/People/Berners-Lee/FAQ.html#etc
  3. https://tools.ietf.org/html/rfc3305

URI 、URL 和 URN的更多相关文章

  1. URI, URL, and URN

    URI: uniform resource identifier,统一资源标识符,用来唯一的标识一个资源. URL: uniform resource locator,统一资源定位器,它是一种具体的U ...

  2. URL、URN、URI的区别?

    URL.URN.URI区别 既然Web应用程序的文件等资源是放在服务器上,而服务器是因特网(Internet)上的主机,当然必须要有个方法,告诉浏览器到哪里取得文件等资源.通常会听到有人这么说:“你要 ...

  3. 关于URI URL URN

    刚琢磨.整理了关于escape.encodeURIComponent.encodeURI的知识.突然又对URI有点模糊了,遂整理了以下资源 : 资源一: URL,URI 和URN 的举例理解 资源二: ...

  4. URI、URL、URN介绍

    注:1. 仅从http(Hypertext Transfer Portocol)角度阐述,不涉及语言层面的类库. 2. 以下内容均参考<Http权威指南>一书. 一.万维网构成       ...

  5. uri,url.urn

    uri:Web上可用的每种资源 - HTML文档.图像.视频片段.程序等 - 由一个通过通用资源标志符(Universal Resource Identifier, 简称"URI" ...

  6. URI、URL和URN

    URI.URL和URN URI :Uniform Resource Identifier,通用资源标识符: URL:Uniform Resource Locator,统一资源定位符: URN:Unif ...

  7. URI、URL以及URN的区别

    首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源.而URL是uniform resource locator,统一资源定位器,它是一种具体 ...

  8. URI、URL、URN

    URI.URL.URN URI(Uniform Resource Identifie):统一资源标识符 URL(Uniform Resource Locator):统一资源定位符 URN(Unifor ...

  9. Http权威指南笔记(一) URI URL URN 关系

    定义 URI:统一资源标识符(Uniform Resource Indentifier)用来标识服务器上的资源. URL:统一资源定位符(Uniform Resouce Locator)是资源标识符最 ...

  10. URI ,URL 和 URN

    URI : 统一资源标识符,用来唯一标识互联网资源,包括URL和URN URL:统一资源定位器 包含: 协议,域名,端口,路由,参数,hash https://i.cnblogs.com/EditPo ...

随机推荐

  1. filter函数和map函数

    filter filter()函数接收一个函数 f 和一个可迭代对象,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返 ...

  2. Makefile 10——打造更专业的编译环境-huge项目

    先手工创建几个文件目录: 接下来先创建code/foo/src目录下的Makefile: .PHONY: all clean MKDIR = mkdir RM = rm RMFLAGS = -rf C ...

  3. php的json校验json-schema

    客户端和服务端的http信息传递,采用json几乎成了标配.json格式简单,易于处理,不过由于没有格式规定,无法校验. 好在php有json-schema模块,可以用来验证json是否符合规定的格式 ...

  4. jQuery插件开发全解析<转>

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  5. USB转TTL 下载线 线序定义

    产品名称:USB转TTL 下载线 长度       :1米 芯片       :PL2303HX.PL2303TA. 线序定义红+5V, 黑GND, 绿TXD,白RXD

  6. SSL/TLS协议运行机制的概述_转

    转自:SSL/TLS协议运行机制的概述 作者: 阮一峰 日期: 2014年2月 5日 互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和 ...

  7. oozie调度hive脚本demo

    1. 环境配置 2. 脚本配置 3. 执行job 4. 查看结果 待发布 ..

  8. ardunio

    fritzing,  arduino简易电路图制作软件

  9. Fastcgi_Finish_Request 提高页面响应速度

    当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法.按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行 ...

  10. 情商 EQ & 儿童情商

    EQ 包括哪些内容 1. 认知自身情绪的能力(正确客观的评价自己)2. 管理自己情绪的能力(控制冲动) 3. 自我激励能力(学会抗挫折) 4. 认识他人情绪的能力(学会移情) 5. 人际关系处理能力 ...