URL简介(下)

4 篇文章 0 订阅

相对URLURL分为相对URL和绝对URL,之前例子中我们看到的都是绝对URL,绝对URL包括了我们请求资源需要的所有东西,而相对URL是不完整的,想要通过相对URL来获取资源,就必须要加上它所“相对的”另一个URL,也就是根URLBase URL)。如果你写过HTML代码的话,你会发现相对URL非常方便简洁,例如:

<HTML>

<HEAD><TITLE>Joe'sTools</TITLE></HEAD>

<BODY>

<H1> ToolsPage </H1>

<H2> Hammers<H2>

<P> Joe'sHardware Online has the largest selection of <AHREF="./hammers.html">hammers

</A> onearth.

</BODY>

</HTML>

这个HTML文件的URLhttp://www.joes-hardware.com/tools.html,所以文件中的“./hammers.html”是相对于http://www.joes-hardware.com而言。

相对URL允许HTML编码人员省略掉URL中的schemehostport等组成部分,这些内容能够从代码所在文件的Base URL中推测出来。

下面的图片说明了上面例子中相对URL的最终组装方式:

【原创】URL简介(下) - 远行的风 - 风的驿站

相对URL只是URL的一部分,因此应用程序(例如浏览器)需要能够在相对URL和绝对URL之间进行转换。

除了书写上更加简便之外,相对URL使得转移资源更加方便,例如我们将HTML文件和它连接的图片等资源从一个路径转移到了另一个路径,那么如果用绝对URL的话,HTML代码中的所有绝对URL都需要进行替换,对于非常多的文件来说,这会是很大的工程量。但是如果用相对URL的话,完全不需要修改什么。

要将相对URL转换为绝对URL,第一步就是要先找到根URL,根URL有两种来源:第一种是直接在HTML文件中包含<BASE>标签来制定根URL,所有该文件中的相对URL都会相对于这个根URL来计算;第二种情况,也就是当一个资源文件中没有指定根URL的时候,这个文件中的所有相对URL都会基于该文件的URL来计算绝对URL,就如同我们上面例子中的那样。如果没有根URL的情况下,相对URL会被视为无效连接处理。

将相对URL转换为绝对URL的下一个步骤是将相对URL和绝对URL按照组成部分进行拆解,然后按照下面图中的步骤进行绝对URL的组装:

【原创】URL简介(下) - 远行的风 - 风的驿站

 

算法的详细描述在RFC1808中定义,后来并入了RFC2396中。

 

URL中的字符:

URL被设计为可移植的,同时也是为了能够标记所有网络资源而设计的,这也就意味着,URL可是适应各种网络协议。因为不同的协议使用不同机制来传输数据,因此URL被设计为可以安全地通过所有协议来传输。

这里的安全传输是指URL在传输过程中不会丢失数据,某些协议,例如SMTPSimple MailTransfer Protocol,简单报文传输协议),在传输方法中会过滤掉某些字符。为了避免这种情况,URL在设计的时候规定只允许使用相对范围较小的,被广泛使用的字符表中的字符(以下称为安全字符)。

此外,为了URL能够被所有网络协议传输,设计者希望URL具有可读性,因此,一些不可见的(例如空格,回车)或者不可打印输出的(例如警报声音字符)字符也从URL的可用字符中排除掉了。

有时候URL中需要包括二进制数据或者是安全字符表之外的字符(例如汉子,拉丁字母等等),这时候需要将这些字符转义成安全字符来传输。

转义机制通过将不安全字符通过编码来转换成安全字符组成的字符串,转义后的字符串由百分号“%”开头,后面接两位16进制数字。下面是一些转义的例子:

字符

ASCII

示例URL

~

1260x7E

http://www.joes-hardware.com/%7Ejoe

空格

320x20

http://www.joes-hardware.com/more%20tools.html

%

370x25

http://www.joes-hardware.com/100%25finish .html

下表列出了URL中保留字符以及限制使用的字符:

字符

保留/限制的原因

%

作为转义字符的起始字符被保留

/

作为URL的组成path组成部分的分段符被保留

.

用于path组成部分,被保留

..

用于path组成部分,被保留

#

用于frag组成部分,被保留

?

用于query string组成部分,被保留

;

用于param组成部分,被保留

:

用于schemeuser/passwordhost/port,被保留

$ , +

保留

@ & =

在某些方案(scheme)中有特殊含义,被保留

{ } | \ ^ ~ [ ] ‘

很多传输设备不能保证安全传输这些字符,因此被限制使用

< > “

不安全字符,需要被编码

0x00–0x1F, 0x7F

这个区间内的字符对应的US-ASCII码为不可打印字符,因此被限制使用

> 0x7F

这个区间内的字符超出7-bit范围所定义的US-ASCII字符集,因此被限制使用

你可能会遇到明明使用了非安全字符却没有出现问题的情况,但是这仅仅是运气好而已,恰好你使用的协议没有将非安全字符丢弃掉,但是这绝不是最稳妥的选择,所以一定记得在使用非安全字符前将其转义。当然也不要过度转义,当你将安全字符转义的时候,接收到这个URL的客户端可能并不知道这个转义,而会将转义结果当成多个字符导致奇怪的现象。有时候,网络攻击者可能会通过将不需要的字符转义来多开安全过滤规则的匹配。

 

常用URL方案(scheme)一览:

方案

简介

http

Hypertext Transfer Protocol(超文本传输协议),遵循URL的通用格式,不需要用户名和密码,默认端口为80(不需要显示),基本格式:

http://<host>:<port>/<path>?<query>#<frag>

例子:

http://www.joes-hardware.com/index.html http://www.joes-hardware.com:80/index html

https

http的孪生兄弟,唯一的区别是https使用网景公司(Netscape)的Secure Socket LayerSSL,安全套接字层)来提供端到端的对HTTP连接的加密,格式和http完全相同,默认端口443

基本格式:

https://<host>:<port>/<path>?<query>#<frag>

例子:

https://www.joes-hardware.com/secure.html

mailto

mailto用来指示电子邮件地址,由于电子邮件和其他的方案不同(它并不直接指向一个可以直接访问的资源),因此mailto的格式也与URL的基本格式有区别,关于这个方案的具体格式在RFC 822中有详细的定义。

例子:

mailto:joe@joes-hardware.com

ftp

File Transfer Protocol,文本传输协议,用来从/FTP服务器上下载/上传文件,此外还可以用来获取FTP服务器上的文件结构和文件夹结构。FTP格式遵循URL的基本格式:

ftp //<user>:<password>@<host>:<port>/<path>;<params>

例子:

ftp://anonymous:joe%40joes-hardware.com@prep.ai.mit.edu:21/pub/gnu/

rtsp, rtspu

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_video

file

用来访问本地磁盘,网络文件系统,文件共享中的文件,格式遵循URL基本格式,如果host被省略,则指向本地磁盘。

基本格式:

file://<host>/<path>

例子:

file://OFFICE-FS/policies/casual-fridays.doc

telnet

用来访问交互式服务,它并不指向一个具体的文件,而是指向一个能够通过telnet协议来访问的交互式应用。

基本格式:

telnet //<user>:<password>@<host>:<port>/

例子:

telnet //slurp:webhound@joes-hardware.com:23/

 

未来的发展趋势将会是怎样的?我们知道,URL明确的指向了网络中的某个资源,当服务器迁移了或者是地址更换了,则原来的URL就失效了,不能够再获取到资源了。而URN正是期望解决这个问题的一个方案,URN通过名字来标记资源,而不关心资源到底在什么地方,这就意味着,即使资源迁移了,对于URN来说没有任何影响。但是URN实施起来还有很长一段路要走,要知道,指定标准并不是一件短期就能完成的事儿,需要做的工作还有很多很多。

 

  • 85
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值