1.URI

明确几个概念:
- **URI:**Uniform Resource Identifier 统一资源标识符
- **URL:**Uniform Resource Locater 统一资源定位符
- **URN:**Uniform Resource Name 统一资源命名

这仨玩意儿长得差不多,严格来说,URI包括两种,一种是URL,一种是URN. 也就是说现在最常用的URL是URI的一个子集.
而URL和URN的区别,从名字上就能看出来.

  • URL是以资源的位置(location)来定位一个资源的.
  • URN是以资源的名称来定位资源.

举个例子,比如我要找某个RFC文档,通过URL的话,可以标记为:ftp://www.ietf.com/rfc/rfc2041.txt
而是用URN标识的话就可以写成,urn:ietf:rfc:rfc2041

URN的技术瓶颈在于,需要一套完善的资源定位服务器来实现资源名称的解析. URN是未来发展的一个趋势,它可以只考虑文件的名称,而不用考虑其物理存储位置(是不是类似磁力链接的一个玩意儿. )但是URN像IPv6一样,是一个美好的未来,但目前来看也仅仅是一个未来. 所以,目前说到URI暂时就可以理解为URL.

2.URL语法

可能我们都知道http://www.thecatcher.net/index.html这样的的URL,但是如果URL如果仅仅是这样的话,怎么体现URL的牛逼之处. 下面这个是URL的完整语法格式.

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

  • scheme: 方案,可以理解为一个协议名,之名该URL所使用的协议. 大小写无关.
  • 主机和端口
  • 用户名和密码:这一部分是可选的http://joe:joespasswd@www.joes-hardware.com/sales_info.txt 比如像这个样子
  • 路径
  • 参数:提供一些参数 比如 ftp://prep.ai.mit.edu/pub/gnu;type=d 提供了一个type参数,其value是d. 路径可以分成若干段,每段都可以有自己的参数. 比如http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true
  • 查询字符串:通过?标识,提供一些可用于查询的参数.不同的查询字符串之间可以通过&隔开. http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue
  • 片段: HTML的锚点就是一个所谓的片段,用于表示一个完整资源中的一部分. 一般情况下,服务端只处理完整的资源,而这个片段的参数是交给客户端来处理的.

相对URL和绝对URL

URL分为绝对URL和相对URL. 绝对URL就是包含所有信息的一个URL. 而相对URL是相对于一个base URL来说的. 相对URL是不完整的在解析的时候需要和对应的base URL拼接在一起才能找到对应的资源.

相对URL

要使用相对URL的前提是能够得知其所对应的base URL. base URL可以来自三个地方:
- 在资源中显式的指定. 比如使用<base>标签
- 在一个没有显示指定base的资源中,发现了一个相对URL,那么就以该资源自身所属的URL作为base. 比如你在一个html文件路径是(/home/www/html/test.html)中指定了一个图片<img src="./hot.jpg" 那么在解析时,会使用该文件所在的路径作为base即 /home/www/html/(说的有点玄乎,其实就是个相对路径啦)

相对URL的解析

URL的常用协议

http

超文本传输协议方案,除了没有用户名和密码之外,与通用的 URL 格式相符。如果省略了端口,就默认为 80。
基本格式:
http://<host>:<port>/<path>?<query>#<frag>
示例:
http://www.joes-hardware.com/index.html
http://www.joes-hardware.com:80/index.html

https

方案 https 与方案 http 是一对。唯一的区别在于方案 https 使用了网景的 SSL,SSL 为HTTP 连接提供了端到端的加密机制。其语法与 HTTP 的语法相同,默认端口为 443。
基本格式:
https://<host>:<port>/<path>?<query>#<frag>
示例:
https://www.joes-hardware.com/secure.html

mailto

Mailto URL 指向的是 E-mail 地址。由于 E-mail 的行为与其他方案都有所不同(它并不指向任何可以直接访问的对象) ,所以 mailto URL 的格式与标准 URL 的格式也有所不同。因特网 E-mail 地址的语法记录在 RFC 822 中。
基本格式:
mailto:<RFC-822-addr-spec>
示例:
mailto:joe@joes-hardware.com

ftp

文件传输协议 URL 可以用来从 FTP 服务器上下载或向其上载文件,并获取 FTP 服务器上的目录结构内容的列表。在 Web 和 URL 出现之前 FTP 就已经存在了。Web 应用程序将 FTP 作为一种数据访问方案使用。URL 语法遵循下列通用格式。
基本格式:
ftp://<user>:<password>@<host>:<port>/<path>;<params>
示例:
ftp://anonymous:joe%40joes-hardware.com@prep.ai.mit.edu:21/pub/gnu/

rtsp,rtspu

RTSP URL 是可以通过实时流传输协议(Real Time Streaming Protocol)解析的音 / 视频媒体资源的标识符。方案 rtspu 中的 u 表示它是使用 UDP 协议来获取资源的。
基本格式:
rtsp://<user>:<password>@<host>:<port>/<path>
rtspu://<user>:<password>@<host>:<port>/<path>
示例:
rtsp://www.joes-hardware.com:554/interview/cto_video38

file

方案 file 表示一台指定主机(通过本地磁盘、网络文件系统或其他一些文件共享系统)上可直接访问的文件。各字段都遵循通用格式。如果省略了主机名,就默认为正在使用URL 的本地主机。
基本格式:
file://<host>/<path>
示例:
file://OFFICE-FS/policies/casual-fridays.doc

news

根据 RFC 1036 的定义,方案 news 用来访问一些特定的文章或新闻组。它有一个很独特的性质:news URL 自身包含的信息不足以对资源进行定位。news URL 中缺乏到何处获取资源的信息——没有提供主机名或机器名称。从用户那里获取此类信息是解释程序的工作。比如,在网景浏览器的“选项” (Options)菜单中,就可以指定自己的 NNTP(news)服务器。这样,浏览器有了 news URL 的时候就知道应该使用哪个服务器了。
新闻资源可以从多台服务器中获得。它们被称为位置无关的,因为对它们的访问不依赖于任何一个源服务器。news URL 中保留了字符“@” ,用来区分指向新闻组的 news URL 和指向特定新闻文章的news URL。
基本格式:
news:<newsgroup>
news:<news-article-id>
示例:
news:rec.arts.startrek

telnet

方案 telnet 用于访问交互式业务。它表示的并不是对象自身,而是可通过 telnet 协议访问的交互式应用程序(资源) 。
基本格式:
telnet://<user>:<password>@<host>:<port>/
示例:
telnet://slurp:webhound@joes-hardware.com:23/

展望美好的未来…

URL可以准确的定位到资源,但是,他是一种不稳定的定位方式. 最简单的,如果我的文件换了位置,那么就必须更新对应的url. 那些活在教科书中被我们瞻仰的学院派的专家大神们,他们一直致力于让这个世界便的更加完美.于是他们提出了URN的概念. 也就是说,资源只与其名称相对应,而不需要考虑物理存储位置. 知道了资源的名称,也就可以找到对应的资源. (有点像磁力链接…)

目前IETF提出了一个可以向下兼容URL的方案,PURL(persistent uniform resource locators),这个方案在请求URL的客户端和服务器之间增加一个中间件. 该中间服务器上记录着永久RUL和资源实际地址的映射. 这样的话每次客户端只需要使用固定的URL 在中间件上请求资源就可以了.

但是从URL到URN的过渡是个极其庞大的工程.(貌似IP4to6也是这么说…)最主要的,URL的应用如此广泛,即使它有着一丢丢的小问题,大家也早就接受了,由于URL的使用太广泛了(IPv4也是)过渡到URN如果没有完善的兼容URL方案的话,几乎是件不可能的事情.

所以展望的未来,或许仅仅是个遥远的未来吧.

HTTP学习笔记01-URL的更多相关文章

  1. 软件测试之loadrunner学习笔记-01事务

    loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...

  2. thinkphp学习笔记6—url模式

    原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...

  3. C++ GUI Qt4学习笔记01

    C++ GUI Qt4学习笔记01   qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...

  4. SaToken学习笔记-01

    SaToken学习笔记-01 SaToken版本为1.18 如果有排版方面的错误,请查看:传送门 springboot集成 根据官网步骤maven导入依赖 <dependency> < ...

  5. Redis:学习笔记-01

    Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...

  6. PHP 学习笔记 01

    例子: 为什么要学PHP 主观原因: 前段时间在学校处理了毕业的一些事情,回到上海后开始了找工作的旅程.意向工作是WPF开发或者ASP.NET 作为后端的WEB开发. 陆陆续续一直在面试,其中有一家公 ...

  7. vue.js 2.0 官方文档学习笔记 —— 01. vue 介绍

    这是我的vue.js 2.0的学习笔记,采取了将官方文档中的代码集中到一个文件的形式.目的是保存下来,方便自己查阅. !官方文档:https://cn.vuejs.org/v2/guide/ 01. ...

  8. HTTP学习笔记01

    参考内容: 关于HTTP协议,一篇就够了 理解HTTP协议 HTTP 协议入门 超文本传输协议- 维基百科,自由的百科全书 HTTP 昨天通过读文档.读博文.看教程学习了一下HTTP协议,发现真是“天 ...

  9. xml基础学习笔记01

    注意:刚刚看了网上对于XML中的标签,节点和元素?到底应该怎么表述?起初我也有这个疑惑,现在我的想法是:下面出现node的应称作节点,节点对象.element应称作元素,毕竟这更符合英文的本意.至于标 ...

  10. Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net

    Ext.Net是一个对ExtJS进行封装了的.net控件库,可以在ASP.NET WebForm和MVC中使用.从今天开始记录我的学习笔记,这是第一篇,今天学习了如何在WebForm中使用Ext.Ne ...

随机推荐

  1. postgresql on centos (sequelize+pg+nodejs):Failed to find PostgresSQL server.Pleast double check your settings

    公司的一个项目,使用的nodejs做服务端,数据库是postgresql,在本地时一切ok,放在centos时,postgresql配置ok,可以远程访问,但是nodejs在centos启动时,就会报 ...

  2. 离散数学及其应用(Discrete Mathematica With Application 7th)学习笔记 第一章

    目前本人只进行到了第五章的章末补充练习,应该是从4月6号开始学习的,又是英文版,而且基本就下班回家抽2个小时左右去学,所以进度较慢. 由于本质是数学,除了一些程序处理和大计算量的问题,基本上一本草稿本 ...

  3. git Staging Deleted files

    Use git rm foo to stage the file for deletion. (This will also delete the file from the file system, ...

  4. MathType可以编辑省略号吗

    说到省略号大家可能会想到写文章的时候会用到,其实在数学中也会常常的使用到.当数学过程是重复有规律性的过程时,就会用到它.MathType是一款数学公式编辑器,那么,在数学公式中,MathType编辑时 ...

  5. pyhon多进程知识整理

    多进程概要: 在Unix/Linux下,可以使用fork()调用实现多进程. 要实现跨平台的多进程,可以使用multiprocessing模块. 进程间通信是通过Queue.Pipes等实现的. 要让 ...

  6. iOS面试题--Model层--沙盒的目录结构是怎么样的?各自一般用于什么场合?

    沙盒的目录结构是怎么样的?各自一般用于什么场合? 一.iOS沙盒机制 iOS的应用只能访问为该应用创建的区域,不可访问其他区域,应用的其他非代码文件都存在此目录下,包括图片,属性文件plist,bun ...

  7. Handler机制原理

    andriod提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange). 1)Loo ...

  8. [转]Excel关闭进程

    原文地址:http://www.cnblogs.com/feishu/archive/2010/05/08/1730797.html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  9. hoj 2715 (费用流 拆点)

    http://acm.hit.edu.cn/hoj/problem/view?id=2715 将每个格子 i 拆成两个点 i’, i’’并加边(i’, i’’, 1, -Vi), (i’, i’’, ...

  10. poj1026(置换找循环节)

    找到循环节,然后对应的变换 Cipher Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20377   Accepted:  ...