一、URL的语法 

URL是互联网资源的标准化名称

URL提供了一种定位互联网上任意资源的手段,但这些资源要通过不同方案(协议:比如http、ftp、smtp)来访问,因此URL语法会略有差异

大部分URL都遵循通用的语法,而且不同URL方案风格和语法都有重叠

大多数URL协的语法都建立在下面9个部分构成的通用格式上:

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

其中最重要的3个部分是:方案(scheme)、主机(host)和路径(path)

通用URL组件:

1、方案-使用什么协议

方案:实际上规定了如何访问指定资源的主要标识符,它告诉负责解析URL的应用程序应该是用什么协议

方案组件必须以一个字母符号开始,由第一个“:”符号将其与URL其余部分分隔开来。(方案名大小写不敏感)

2、主机与端口

想要在往上寻找到资源,应用程序需要知道哪台机器装载了资源,以及在机器的什么地方可以找到对目标资源进行访问的服务器,URL的主机和端口提供这2点信息

主机组件标识了往上能访问资源的宿主机器。可用主机名或者IP地址来表示主机名。比如下面2个URL就是指向同一个资源

主机名指向:http://joes-hardware.com:80/index.html

IP指向:161.58.228.45:80/index.html

端口组件标识了服务器正在监听的网络端口。对下层使用TCP协议的http协议来说,默认端口为80

3、用户名和密码

有些服务器都要求输入用户名和密码才允许用户访问数据,比如FTP(文件传输协议),如下面几个例子

ftp://ftp.prep.ai.mit.edu/pub/gnu

没有用户名和密码,只有标准的协议、主机和路径;如果某个应用程序使用的URL协议要求输入用户名密码,但用户没有提供,通常会插入一个默认的用户名和密码,比如FTP

ftp://anonymous@ftp://ftp.prep.ai.mit.edu/pub/gnu

指定了一个用户名anonymous,与主机组合在一起,看起来像一个email地址一样;字符“@”将用户名和密码组件与其他部分分隔开来

ftp://anonymous:my_password@ftp://ftp.prep.ai.mit.edu/pub/gnu

指定了用户名和密码,两者之间由字符“:”隔开

4、路径

路径说明了请求的资源位于服务器的什么地方,通常是一个分级的文件系统路径;比如:

http://joes-hardware.com:80/seasona/index-fall.html

这个URL中的资源路径就是seasona/index-fall.html,很像Unix文件系统中的文件系统路径

路径是服务器定位资源所需的信息,可以用“/”将http URL中的路径组件划分为一些路径段(path segment),每个路径段都有自己的参数字段

5、参数

对很多协议来说,只有简单的主机名和到达对象路径的是不够的,除了端口和用户名密码,还需要更多的内容才可以访问

有些负责解析URL的应用程序需要协议参数才能工作;否则服务器不会提供服务,或者提供错误的服务,比如

ftp协议有两种传输方式:二进制和文本。如果用文本形式传送二进制图片,结果很难预料有多糟糕

参数组件是URL中的名值队列表,由“/”将其与其他部分分隔开,比如

ftp://ftp.prep.ai.mit.edu/pub/gnu;type=d

参数为type=d,其中参数名为type,值为d

6、查询字符串

在我们发送请求时,很多的资源,比如数据库服务,都可以通过查询来缩小请求资源的类型范围,例如

http://www.joes-hardware.com/inventoty-check.cgi?itcm-12731

问号(?)右边的内容就是这个URL的查询组件。URL的查询组件和标识网关资源的URL路径组件一起被发送给网关资源。可以将网关当做访问其他应用程序的访问点

如下图:查询目的是检查清单中是否size为large、color为blue的条目

网关基本都是希望查询字符串以一系列“名/值”对的形式出现,名值对之间用“&”分隔

上面的例子,查询组件有2个名/值对:item=12731和color=blue

7、片段

有些资源类型,比如HTML,除了资源级意外,还可以进一步划分,比如一个带有章节的大型文本文档,资源的URL会指向整个文档,但理想情况,可以指向资源中的章节

为了方便引用,URL允许使用片段(frag)组件来表示资源内的一个片段,片段挂在URL右边,最前面有一个字符“#”,比如:

http://www.joes-hardware.comtools.html#drills

这个例子中,片段引用了joes-hardwareweb服务器上页面/tools.html中的一个部分,这部分名字叫drills

服务器处理的是整个对象,URL片段仅由客户端使用并展示

二、URL快捷方式

web可以理解并使用URL的快捷方式,比如缩略,自动扩展(用户输入关键部分,浏览器负责填充)

1、相对URL

URL有2种方式:绝对的和相对的。目前为止,我们使用的URL基本都是绝对的,它包含了访问资源所需的全部信息

相对URL是不完整的,要从相对URL中获取访问资源的全部信息,就必须相对于另一个基础(base)的URL进行解析

相对URL是URL的一种便捷缩略记法,下面是一个嵌入了相对URL的HTML文档实例

<html>
<head><title>joe's tools</title></head>
<body>
<h1>tools page</h1>
<h2>hammers<h2>
<p>joe's hardware online has the largest selection of<a herp="./
hammers.html">hammers
<a/>on earth
</body>
</html>

上面的例子是资源http://www.joes-hardware.com/tools.html的HTML文档,在这个文档中包含了URL./hammers.html的超链接

虽然看起来不完整,但实际上是合法的相对URL,这个URL可以相对于它所在的文档中的URL对其进行解释

使用缩略形式的相对URL语法,写HTML时就可以省略URL中的方案、主机和其他一些组件,这些组件可以从所属资源的基础URL中推导出来,其他资源的URL也可以用这种缩略形式来表示

下图说明了如何从基础URL中推导出缺失的组件信息

相对URL只是URL的片段或一小部分,处理URL的应用程序需要在相对和决定URL之间进行转换

PS:相对URL为了保持一组资源(HTML页面)的便捷性提供了一种便捷方式,如果使用相对URL,可以在搬移一组文档时,仍保持链接的有效性,因为相对URL是相对于新基础进行解释的,类似于在其他服务器提供镜像内容等功能

1.1 基础URL

基础URL是作为相对URL的参考点来使用的,可以来自以下不同的地方:

在资源中显式提供:有些资源会显式指定基础URL

比如:HTML文档中可能会包含一个定义了基础URL的HTML标记<BASE>,通过它来转换HTML文档中的所有相对URL

封装资源的基础URL:如果在一个没有显式指定基础URL的资源中发现一个相对URL,如上面的HTML文档所示,可将其所属资源的URL作为基础

没有基础URL:某些情况没有基础URL,一般意味着你有一个相对URL,但有时可能只是一个不完整或者损坏的URL

1.2 解析相对引用

解析:要将相对URL转换为一个决定URL,需要将相对URL和决定URL划分成组件段,这样,实际上只是在解析URL,但这种做法会将其划分为一个个组件,可以称之为解析/分解URL

将基础和相对URL划分成组件,可以下用下图的算法来完成转换

这个算法将一个相对URL转换成了其绝对模式,之后,就可以用其引用资源

2、自动扩展URL

很多浏览器会在用户提交URL/输入URL时尝试自动扩展URL,这样为用户提供便捷,用户不需要输入完整的URL,浏览器自动扩展

自动扩展特性有以下2种方式:

2.1 主机名扩展

只要有些小提示,浏览器就可以帮你将输入的主机名扩展为完整的主机名,比如:输入baidu,构建出www.baidu.com;弊端在于有时候会为其他http应用程序带来问题,比如代理,后面详细解释

2.2 历史扩展

将以前用户访问过的URL记录储存起来,当用户输入URL时将其与历史记录中的URL前缀进行匹配,并提供一些完整的选项供用户选择

PS:与代理一起使用时,URL自动扩展的行为可能有所不同,后面详细解释

三、URL字符集

URL是可移植的:它命名了互联网上所有的资源,需要通过各种不同协议来传输资源,资源在传输时采取了不同的机制,因此,信息的安全传输就很重要

安全传输意味着URL传输不能丢失信息,但有些协议,比如SMTP(简单邮件传输协议),传输方法就是剥去一些特点的字符

URL是可读的:因此,即使不可见、不可打印的字符能穿过邮件程序,从而成为可移植的,也不能在URL中使用

URL是完整的:有人希望URL中包含初通用的安全字母表之外的二进制数据或字符,因此需要一种转义机制,将不安全的字符编码为安全字符再传输

1、URL字符集

1.1 很多计算机应用程序使用的都是ASCII字符集,ASCII使用7位二进制码来表示大多数按键和少数不可控字符,其移植性也很好,但考虑到全球用户太多,以及有时候URL中会包含任意二进制数据

就需要将转义序列集成进来,通过转义序列将ASCII字符集的有限子集对任意字符值或数据进行编码,这样就实现了可移植和完整性

1.2 编码机制

为了避开安全字符集带来的限制,人们设计了“转义”表示法来表示不安全字符,其中包含一个百分号(%),后面跟2个表示字符ASCII码的十六进制数,下面是几个例子

1.3 字符限制

URL中,有几个字符被保留起来,有着特殊含义。有些字符不在定义的ASCII字符集中,还有些字符会和某些协议网关产生混淆,因此不赞成使用

四、常见协议

下面附录一个关于常用常见的协议列表

五、URL未来发展

URL可用来命名所有现存对象,其还提供一种可在各种协议间共享的统一命名机制,但并不完美;因为URL只表示实际地址,而不是准确的名字,意味着如果资源地址有变化,URL就无法对其进行定位

永久统一资源定位符(PURL),其本质是搜索资源过程中引入一个中间层,通过一个中间资源定位符(resource locator)服务器对资源的实际URL进行登记和追踪

客户端可以向定位符请求一个永久的URL,定位符可以以一个资源为响应,将客户端重定向到资源当前的URL去

http协议进阶(二)URL与资源的更多相关文章

  1. TCP/IP协议族(二) HTTP报文头解析

    本篇博客我们就来详细的聊一下HTTP协议的常用头部字段,当然我们将其分为请求头和响应头进行阐述.下方是报文头每个字段的格式,首先是头部字段的名称,如Accept,冒号后方紧跟的是该字段名所对应的值,每 ...

  2. Android进阶(二十)AndroidAPP开发问题汇总(四)

    · Android进阶(二十)AndroidAPP开发问题汇总(四) android:layout_width和android:width的区别 基中的android:layout_width和and ...

  3. HTTP权威指南读书笔记(一)HTTP概述、URL和资源及报文详解

    一.HTTP概述 1.WEB客户端和服务器. 2.资源:资源可以是各种格式的静态文件,也可以是应用程序. 3.媒体类型 4.URI:统一资源标识符 URL:统一资源定位符. URL的第一部分称为方案: ...

  4. HTTP协议(二)header标头说明

    HTTP协议(二):header标头说明 Header 解释 示例 Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Accept-Ranges: bytes Age 从 ...

  5. HTTP学习之URL与资源

    URL是因特网资源的标准化名称,该字符串指向一条电子信息片段,定义服务端应用程序在什么位置以及客户端要如何与其交互 一条完整的URL由多个片段组成. 通用URL组件 方案 以哪种协议访问服务器 用户 ...

  6. http协议进阶(一)http概述

    参考书籍——<HTTP权威指南> 1.web客户端和服务器 http客户端发出请求,其中包含请求内容,发给服务器,服务器再返回内容中回送请求的数据,http客户端和服务器构成了万维网的基本 ...

  7. HTTP权威指南笔记-2.URL与资源

    2.1 URI与URL.URN URL是浏览器寻找信息时所需的具体位置.URl是人们对HTTP和其他协议的常用访问点:浏览器指向一个URL,浏览器就会发送适当的协议报文向服务器获取内容. URI是一类 ...

  8. URL与资源

    资源推荐 1.HTTP权威指南. <HTTP权威指南>由古尔利所著,<HTTP权威指南>详细解释了HTTP协议,包括HTTP是如何工作的,如何用HTTP来开发基于Web的应用程 ...

  9. HTTP协议(二)

    一.请求的格式: (一).请求行 (1).请求方法 1.GET 2.POST 3.PUT 4.DELETE 5.TRACE 6.OPTIONS (2).请求路径 (3).所用的协议 (二).请求头信息 ...

随机推荐

  1. Java02

    一.IDE的概念.eclipse的介绍.安装.使用 (用eclipse写HelloWorld例子)     1.什么是IDE(Integrated Development Environment)? ...

  2. An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案

    使用EF对建立了关系的表新增记录时出现: An entity object cannot be referenced by multiple instances of IEntityChangeTra ...

  3. 留言列表模板HTML代码

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  4. jQuery 购物车鼠标经过出现下拉框的做法

    这一段时间在学习web前端,最近学了jQuery库,深感其强大,下面通过写购物车的下拉框做法,把自己的理解和大家交流一下,欢迎各位大神指点指正,废话不多说,开始正题: 购物车html: <!-- ...

  5. sharepoint powershell 批量处理匿名访问

    配置Web Application启用匿名访问 Add-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyCont ...

  6. JSPatch使用小记

    hotfix的作用众所周知,Android和iOS都有各自的技术,但是相比Android的当天发布来说(如果你们的项目不需要灰度),iOS热更新的意义更加重大.因为iOS审核周期长不说,而且运气不好会 ...

  7. Android 手机卫士--对话初次设置密码验证过程

    本文实现设置密码对话框的逻辑判断 本文地址:http://www.cnblogs.com/wuyudong/p/5940551.html,转载请注明出处. 首先添加上图按钮的监听事件代码 /** * ...

  8. spring-boot-framework 如何自动将对象返回成json格式

    使用srping-rest-mvc 的时候只要在工程的classpath中包含jackson的2.x版本,就可以不用自己做json格式的转换了. 如在你的pom文件中加入以下的依赖: <depe ...

  9. android-async-http AsyncHttpClient介绍

    前一阵子刚搬了家,加上公司要发新版本,所以一直比较忙,文章也好几周没更新了.难得这个周末有空,正好周内偶然间闲逛 发现这个很不错的第三方开源类库,针对Android开发中发送http请求的. 在And ...

  10. android 传感器应用

    本章讲述Android开发中,传感器应用相关的知识点. 1.功能需求 做一个基于传感器的水平尺应用. 2.软件实现