您的位置:首页 > 其它

URL详解

2016-02-29 22:29 148 查看
一,URL的结构

例如:scheme://login:password@address:port/path/to/resource?query_string#fragment。

这是一个符合规范的绝对URL,它包括了访问特定资源所需要的全部信息,绝对URL和访问时的状态无关,与之相对应的是省略了部分信息的相对URL,相对URL需要在上下文环境里的基准URL才能确定出完整的URL地址。接下来我们来分布的详解URL:

(1)协议名称

协议名称一般由不区分大小写的字符串组成,最后以冒号结束,表明获取该资源所需的协议,例子中的scheme:这就是URL中的协议名称部分,常见的协议名称有http: ftp: https: 等等。,而实际上浏览器会支持一些额外的协议,例如data: javascript: 等协议。

在浏览器解析之前,我们应当区分URL是相对URL还是绝对URL,在RFC中规定的是绝对URL应当遵循在:之前只能出现字母和”+“,”-“,”.“这几个符号。但在实际中,每种浏览器都会稍微偏离这个要求,例如IE会忽略所有不可打印的字符的,Chrome会忽略空字符等等。

(2)层级URL符号

层级URL符号”//“,在RFC规范中规定的语法中,层级URL符号在授权信息之前,每个层级结构的绝对URL都应当包含层级URL符号。(需要注意的是一个非层级结构URL结构的例子就是mailt: 协议)。

(3)访问资源的身份验证

例子中的”login:password”这一部分就是访问资源的身份验证这是一个可选项,在向服务器获取数据时,有可能要在该位置制定一个用户名或者密码用来进行身份验证,身份验证信息的传输是和协议相关的。

除了大多数浏览器对身份验证部分的数据几乎可以接受任何字符,但是safari拒绝了”<,>,{,}”,firefox还拒绝换行符。

(4)服务器地址

对于完整的URL来说,服务器部分必须指定一个不区分大小写的域名、一个ipv4地址或者是一个ipv6地址,firefox还会接受在一对中括号中写的ipv4地址和主机名,例子中的adress中便是服务器地址。大多是浏览器还支持八进制,十进制,十六进制,甚至可以接受把几个或者全部的八位元拼在一起转换成单个整数的写法。(主流的URL解析器会主动的把主机地址的全角句号“。”替换成点号.)。

(5)服务器端口

这部分也是一个可选部分,通常是在连接服务器用到了非标准端口时才会用到,例如HTTP服务默认的端口是80,FTP默认的端口是21,这个默认值可以在URL改写。此外,服务器端口和服务器地址、身份验证三部分合称为授权信息。

(6)层级的文件路径

层级路径非常形象的体现出了从服务器获取特定资源的方式,例如例子中的/path/to/resource,这部分是直接从UNIX命令中借鉴过来的,所以也会支持“/../”和“/./”而对相对URL则会根据这种目录格式,加上基准路径在对应到相对位置上去。

(7)查询字符串

该项也是一个可选项,用于把一串非层级格式的任意参数传递到由前面路径所对应的资源,例如SQL注入中最常见的and1=1,and 1=2都是在这部分填写,例子中的?query_string便是查询字符串。

实际上在RFC文档中对于这部分实际上没有明确的规定该怎么解析,只是把他当成一堆含混的数据传输,关键是接受到的服务器会去怎么识别他,没有特定的规则。

(8)片段ID

这部分和查询字符串有点类似,它是用与客户端而非服务器端,在实际应用中片段ID这部分在浏览器中只有一个用途,指向HTML中锚点的名称,用于页面定位浏览。方便阅读浏览。

二,整合各部分

一个对于URL解析的算法大致如下

(1)提取协议名称

扫描第一个:符号,在该符号之前的就是协议名称,若是在该部分出现了不该出现的字符,则有可能是个相对URL,获取到的不是协议名称。

(2)去除层级URL符

层级URL符//应该跟在协议名称之后,若是扫描到了,则直接跳过,若是没扫描到,则不用去管这部分。(除了FIREFOX之外的大多数浏览器都支持反斜杠\代替/的作用)。

(3)获取授权信息部分

依次扫描“/”“?”“#”,哪个先出现则以它为准,之前的部分提取出来,从URL里提取出来的部分就是授权部分,也应当注意“\”的情况。

①若是有登陆信息,则定位登录信息

再截取出来的授权信息部分寻找@符号,如果存在,则他前面的部分就是登录信息,登录信息也可以进行进一步的分解在;之前的就是用户名,后面的则是密码数据。

②提取目标地址

授权信息剩下的部分就是目标地址,第一个冒号分开的部分就是主机名和端口,方括号括起来的就是ipv6地址。

(4)确定路径

如果授权部分的结尾跟着一个正斜杠(或者是反斜杠),扫描下一个“?”“#”截取出来的部分就是目标的路径部分,然后再对其进行UNIX的规范化整理。

(5)提取查询字符串

如果在路径部分后边跟着一个问号,则查找下个#或者是字符串额结尾,中间的部分就是查询字符串。

(6)提取片段ID

如果查找到了#符号,则#到字符串结尾的部分就是片段ID。

我们来举一个简答的例子:”http://example.com&gibberish=1234@167772161/

这个URL的目的地址实际上是那串经过编码的数字167772161,对应的IP地址实际上是10.0.0.1。

再来举一个例子:“http://example.com\@prictice.cn/”在FIREFOX中,这个URL会把用户带向prictice.cn,而在别的最终将访问example.com。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: