URI 、URL 和 URN
URI
URI 是 Uniform Resource Identifier 的缩写。
Uniform
- 统一不同类型的资源。比如
txt、mp3、jpeg等不同的类型的资源都可以使用 URI 来标识 - 统一不同协议。比如
http、ftp、mailto等不同的协议都可以使用 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,协议是大小写不敏感的(比如 HTTP 和 http 是一样的),但为了一致性,只应该使用小写来表示协议。常用的有: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,但是确定后最好统一使用而不是混用这两者
参考
URI 、URL 和 URN的更多相关文章
- URI, URL, and URN
URI: uniform resource identifier,统一资源标识符,用来唯一的标识一个资源. URL: uniform resource locator,统一资源定位器,它是一种具体的U ...
- URL、URN、URI的区别?
URL.URN.URI区别 既然Web应用程序的文件等资源是放在服务器上,而服务器是因特网(Internet)上的主机,当然必须要有个方法,告诉浏览器到哪里取得文件等资源.通常会听到有人这么说:“你要 ...
- 关于URI URL URN
刚琢磨.整理了关于escape.encodeURIComponent.encodeURI的知识.突然又对URI有点模糊了,遂整理了以下资源 : 资源一: URL,URI 和URN 的举例理解 资源二: ...
- URI、URL、URN介绍
注:1. 仅从http(Hypertext Transfer Portocol)角度阐述,不涉及语言层面的类库. 2. 以下内容均参考<Http权威指南>一书. 一.万维网构成 ...
- uri,url.urn
uri:Web上可用的每种资源 - HTML文档.图像.视频片段.程序等 - 由一个通过通用资源标志符(Universal Resource Identifier, 简称"URI" ...
- URI、URL和URN
URI.URL和URN URI :Uniform Resource Identifier,通用资源标识符: URL:Uniform Resource Locator,统一资源定位符: URN:Unif ...
- URI、URL以及URN的区别
首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源.而URL是uniform resource locator,统一资源定位器,它是一种具体 ...
- URI、URL、URN
URI.URL.URN URI(Uniform Resource Identifie):统一资源标识符 URL(Uniform Resource Locator):统一资源定位符 URN(Unifor ...
- Http权威指南笔记(一) URI URL URN 关系
定义 URI:统一资源标识符(Uniform Resource Indentifier)用来标识服务器上的资源. URL:统一资源定位符(Uniform Resouce Locator)是资源标识符最 ...
- URI ,URL 和 URN
URI : 统一资源标识符,用来唯一标识互联网资源,包括URL和URN URL:统一资源定位器 包含: 协议,域名,端口,路由,参数,hash https://i.cnblogs.com/EditPo ...
随机推荐
- 使用digitalocean搭建v·p·s
这几天digitalocean开始猛卡,一顿操作之后连不上了=_=遂复习了一下怎么搭vps 准备工作 事先准备好Putty,直接百度搜索下载即可(也可直接使用digitalocean的access c ...
- etcd+calico集群的部署
etcd单机模式 设置环境变量 1 export HostIP="192.168.12.50" 执行如下命令,打开etcd的客户端连接端口4001和2379.etcd互联端口238 ...
- Java的==与equals之辨,简单解释,很清楚
"=="和equals方法究竟有什么区别? (单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) ==操作符专门用来比较两个变量的值 ...
- java:常用的两种设计模式(单例模式和工厂模式)
一.单例模式:即一个类由始至终只有一个实例.有两种实现方式(1)定义一个类,它的构造方法是私有的,有一个私有的静态的该类的变量在初始化的时候就实例化,通过一个公有的静态的方法获取该对象.Java代码 ...
- ashx上传姿势
很多情况下网上流传的cer,asa,cdx……等等来上传,其实很多时候是不行的.但是ashx会好一些. PS:其实这个姿势也蛮老了,但是还是相当一大部分站点存在.也是一个姿势所以写博文记住它.免得忘了 ...
- centos7系统nginx下phalcon环境搭建
之前我们采用的是Apache服务器,可是每秒响应只能达到2000,听说nginx可以轻易破万, 于是换成nginx试试. phalcon的官网有nginx重写规则的示例,可是却与apache的不一致, ...
- centos7 /etc/rc.local需要chmod +x /etc/rc.d/rc.local
Centos 7.0设置/etc/rc.local无效问题解决 安装centos7以后按照以往习惯修改rc.local添加开机启动命令,但重启后发现无效,再次重启发现依然如故 检查系统rc.local ...
- js生成唯一的uuid
---恢复内容开始--- 在做项目的时候出现这样的一种情况,需要动态生成唯一的uuid,刚开始我的思路是这样的,我可以根据时间来做,然后出现了下面的思路: var uuid = "cms&q ...
- IOS让返回按钮显示自定义标题而不是上个ViewController的title
在开发IOS的时候发现当从一个ViewController跳转到另一个ViewController时,被跳转到的那个ViewController的返回按钮总是显示的是上个ViewController的 ...
- addLoadEvent
function addLoadEvent(func){ var oldOnload = window.onload; if(typeof(window.onload) != 'function'){ ...