一、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. Swift - 轮播图

    学写swift, 试着弄了一个轮播图, 仿照 HHBannerView的OC代码 Demo地址: https://github.com/liguoliangiOS/ZJGenWoYou.git 一.第 ...

  2. python基础之正则表达式

    正则表达式语法 正则表达式 (或 RE) 指定一组字符串匹配它;在此模块中的功能让您检查一下,如果一个特定的字符串匹配给定的正则表达式 (或给定的正则表达式匹配特定的字符串,可归结为同一件事). 正则 ...

  3. 使用TopSelf创建自宿主的Windows服务程序

    在传统的Windows服务开发过程中,需要添加一个服务安装程序,里面写安装,启动和停止服务等逻辑.现在,使用TopSelf可以简化这个过程. 首先,继承 ServiceControl 写一个应用服务类 ...

  4. 基于SSH框架的学生公寓管理系统的质量属性

    系统名称:学生公寓管理系统 首先介绍一下学生公寓管理系统,在学生公寓管理方面,针对学生有关住宿信息问题进行管理,学生公寓管理系统主要包含了1)学生信息记录:包括学号.姓名.性别.院系.班级:2)住宿信 ...

  5. 简析 .NET Core 构成体系

    简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...

  6. 安全退出,清空Session或Cookie

    概览: 网站中点击退出,如果仅仅是重定向到登录/出页面,此时在浏览器地址栏中输入登录后的某个页面地址如主页,你会发现不用登录就能访问.这种所谓的退出并不是安全的. 那么怎样做到安全退出呢? 那就是点击 ...

  7. 无限级ddsmoothmenu菜单实例

    点击这里查看效果以横向ddsmoothmenu下来菜单为例,以下是实现代码: <base target="_blank" /><link rel="st ...

  8. 自定义JS控件-简单示例

    1.  业务需求: 制作 一个按钮对象,然后 像 winfrom  那样调用 就可以了: 首先 我们新建一个 MyControls的 JS文件:(插入如下代码) //这里运用的面向对象的思想 ,新建了 ...

  9. IE9 IE8 ajax跨域问题的解决

    项目中用到的跨域 ,在除IE9以下的浏览器上运行都是没有问题的,IE8 IE9中报错,error :no transport; 网上解决办法均是 在发起请求之前添加 jQuery.support.co ...

  10. iOS UINavigationController的使用

    NavigationController,又称导航控制器.是iOS开发中比较常用的一种容器ViewController,常用于页面的管理和切换. 在开发中,NavigationController常常 ...