HTTP协议——URL

        URL 是一种 URI,它标识一个互联网资源,并指定对其进行操作或获取该资源的方法。可能通过对主要访问手段的描述,也可能通过网络“位置”进行标识。

        大部分URL遵循一种标准格式,该格式包含三个部分:
        第一部分:方案,方案告知Web客户端怎样访问资源
        第二部分:服务器的位置,告知Web客户端资源位于何处。

        第三部分:指定服务器上某个资源,说明了请求的是服务器上的哪个特定的资源。

1、URL格式

大多数URL协的语法都建立在下面9个部分构成的通用格式上:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
其中最重要的3个部分是:方案(scheme)、主机(host)和路径(path)

2、URL组成部分介绍

组件

描述

默认值

方案

访问服务器以获取资源时要使用哪种协议

用户

某些方案访问资源时需要的用户名

匿名

密码

用户名后面可能要包含的密码,中间由冒号分隔

<E-mail 地址>

主机

资源宿主服务器的主机名或点分IP地址

端口

资源宿主服务器正在监听的端口号。很多方案都有默认端口号

每个方案特有

路径

服务器上资源的本定名,由斜杠将其与前面的URL组件分隔开来。路径组件的语法是与服务器和方案有关。

参数

某些方案会用这个组件来指定输入参数。参数为名/值对。URL中可以包含多个参数字段,它们相互之间以与路径的其余部分之间用分号(;)分隔。

查询

某些方案会用这个组件传递参数以激活因公程序。查询组件的内容没有通用格式。用字符”?”将其与URL的其余部分分隔开来。

片段

一小片或者一部分资源的名字。引用对象时,不会将frag字段传送给服务器。这个字段是在客户端内部使用的。通过字符”#”将其与URL的其余部分分隔开来。

 方案
        规定如何访问指定资源的主要标识符,它会告诉负责解析URL的应用程序应该使用搞什么协议。
        方案组件必须以一个字母符号开始,由第一个“:”符号将其与URL其余部分分隔开来。(方案名大小写不敏感)

主机和端口
        URL的主机和端口组件告诉应用程序要从哪台机器装在资源,以及在哪台机器的什么地方可以找到对目标资源进行访问的服务器。
        主机组件标识了往上能访问资源的宿主机器。可用主机名或者IP地址来表示主机名。
端口组件标识了服务器正在监听的网络端口。

用户名和密码
        很多服务器要求输入用户名和密码才会允许用户访问数据,如FTP。

如果某个应用程序使用的URL协议要求输入用户名密码,但用户没有提供,通常会插入一个默认的用户名和密码。如ftp://ftp.prep.ai.mit.edu/pub/gnu,指定了一个用户名anonymous,与主机组合在一起,看起来像一个email地址一样;字符“@”将用户名和密码组件与其他部分分隔开来ftp://anonymous:my_password@ftp://ftp.prep.ai.mit.edu/pub/gnu指定了用户名和密码,两者之间由字符“:”隔开。


路径
        URL的路径组件说明了资源位于服务器的什么地方。路径通常很像一个分级的文件系统路径。路径是服务器定位资源所需的信息,可以用“/”将http URL中的路径组件划分为一些路径段(path segment),每个路径段都有自己的参数字段。

参数
        对很多协议来说,只有简单的主机名和到达对象路径的是不够的,除了端口和用户名密码,还需要更多的内容才可以访问有些负责解析URL的应用程序需要协议参数才能工作;否则服务器不会提供服务,或者提供错误的服务,比如ftp协议有两种传输方式:二进制和文本。如果用文本形式传送二进制图片,结果很难预料有多糟糕参数组件是URL中的名值队列表,由“/”将其与其他部分分隔开,比如ftp://ftp.prep.ai.mit.edu/pub/gnu;type=d 参数为type=d,其中参数名为type,值为d

查询字符串
        在我们发送请求时,很多的资源,比如数据库服务,都可以通过查询来缩小请求资源的类型范围,例如
http://www.joes-hardware.com/inventoty-check.cgi?itcm-12731 问号(?)右边的内容就是这个URL的查询组件。URL的查询组件和标识网关资源的URL路径组件一起被发送给网关资源。可以将网关当做访问其他应用程序的访问点

片段
        有些资源类型,比如HTML,除了资源级意外,还可以进一步划分,比如一个带有章节的大型文本文档,资源的URL会指向整个文档,但理想情况,可以指向资源中的章节为了方便引用,URL允许使用片段(frag)组件来表示资源内的一个片段,片段挂在URL右边,最前面有一个字符“#”,比如:http://www.joes-hardware.comtools.html#drills 这个例子中,片段引用了joes-hardwareweb服务器上页面/tools.html中的一个部分,这部分名字叫drills。

 

3、URL快捷方式

        Web客户端可以理解并使用几种URL快捷方式。相对URL是在某资源内部指定一个资源的便捷略所方式。很多浏览器支持自动拓展,用户输入URL的关键部分,然后由浏览器将其余部分填充。

3.1相对URL

URL有绝对URL和相对URL两种方式。绝对URL里包含有访问资源所需的全部信息;相对URL是不完整的,要从相对URL中获取访问资源所需的全部信息,就必须相对另一个被称为基础的URL进行解析。相对URL是URL的一种便捷缩略记法。
例如在http://www.joes-hardware.com/tools.html的html文档中,包含一个URL ./hammers.html的超链接,这个URL看似不完整,但实际是合法的相对URL。这个URL是相对于它所在的文档的URL来进行解析的。
使用缩略形式的相对URL语法,HTML的编写就可以省略URL中的方案、主机等组件。这些组件都可以从他们所属资源的基础URL推算出来。
下图说明了如何从基础URL中推导出缺失的组件信息


相对URL只是URL的片段或一小部分,处理URL的应用程序需要在相对和决定URL之间进行转换。相对URL为了保持一组资源(HTML页面)的便捷性提供了一种便捷方式,如果使用相对URL,可以在搬移一组文档时,仍保持链接的有效性;因为相对URL是相对于新基础进行解释的,类似于在其他服务器提供镜像内容等功能。

基础URL

        转换处理的第一步就是找到基础URL,基础URL是作为相对URL的参考点使用的。基础URL可以来自以下几个地方:
(1)、在字眼中显示提供:有些资源会显示地指定基础URL。
(2)、封装资源的基础URL:在一个没有显示指定基础URL的资源中发现了一个相对URL,则可以将它所属资源的URL作为基础。
(3)、没有基础URL:如果没有基础URL,则证明这个相对URL是一个不完整的或者损坏了的URL。

解析相对引用

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


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

自动拓展URL

        很多浏览器会在用户提交URL/输入URL时尝试自动扩展URL,这样为用户提供便捷,用户不需要输入完整的URL,浏览器自动扩展
        自动扩展特性有以下2种方式:
(1)、主机名扩展:在主机名扩展中,只要有些小提示,浏览器通常就可以在没有帮助的情况下,将你输入的主机名扩展为完整的主机名。
(2)、历史扩展:将以前用户访问过的URL记录储存起来,当用户输入URL时将其与历史记录中的URL前缀进行匹配,并提供一些完整的选项供用户选择PS:与代理一起使用时,URL自动扩展的行为可能有所不同,后面详细解释

4、URL字符集

        URL是可移植的:因为URL要统一地命名因特网上的所有资源,而不同的协议在传输数据时都会使用不同的机制,因此URL可以通过任意因特网协议安全地传输是很重要的。
        URL是可读的:因此,即使不可见、不可打印的字符能够穿越邮件程序,从而成为可移植的,也不能在URL中使用。
        URL是完整的:有时候人们会希望URL中包含除通用的安全字母表之外的二进制数据或字符。因此需要一种转移机制,能够将不安全的字符编码为安全字符,再进行传输。

URL字符集

        很多计算机应用程序使用的是US-ASCII字符集,使用7位二进制来表示英文大机子提供的大多数按键和少数用于文本格式和硬件通知的不可打印控制字符。US-ASCII可移植性很好,但是不支持数百种非罗马语言中常见的变体字符。
        因此引入了转义序列集,通过转义序列,就可以用US-ASCII字符集的有限自己对任意自复制或数据进行编码了,这样实现了可移植性和完整性。

编码机制

    为了避开安全字符集带来的限制,人们设计了“转义”表示法来表示不安全字符,其中包含一个百分号(%),后面跟2个表示字符ASCII码的十六进制数。例如,~符号转义成%7E,%符号转义成%25,=符号转义成%3D。

字符限制

    在URL中,有几个字符被保留下来,有特殊意义,不建议使用。如果要用于保留用途以外的场景时,要在URL中对其进行编码。

字符

保留/受限

%

保留作为编码字符的转义标志

/

保留作为路径组件中分隔路径段的定界符

.

保留在路径组件中使用

..

保留在路径组件中使用

#

保留作为分段定界符使用

?

保留作为查询字符串定界符使用

;

保留作为参数定界符使用

:

保留作为方案、用户/口令,以及主机/端口组件的定界符使用

$,+

保留

@&=

在某些方案的上下文中有特殊的含义,保留

{}|\^~[]’ <>”

由于各种传输Agent代理,比如各种网关的不安全处理,使用受限不安全;这些字符在URL范围之外通常是有意义的,所以应该对其进行编码。

0x00-0x1F,0x7F

受限,这些十六进制范围内的字符都在US-ASCII字符集的不可打印区间内。

>0x7F

受限,十六进制值在此范围内的字符都不在US-ASCII字符集的7二进制位范围内。


  • 20
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值