URL

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

  • scheme:协议名称
  • //:层级URL标记符号
  • login@password:访问资源需要的凭证
  • address:获取数据的服务器
  • port:连接的端口号
  • /path/to/resource:指向资源的层级UNIX文件路径
  • query_string:查询字符串参数
  • fragment:片段ID

协议

 协议名称由一串不区分大小写的字符串组成,以冒号结束,表明获取该资源需要使用的协议

RFC1738对绝对URL的规定:冒号":" 之前,只能出现字母、数字、"+"、"-"和"."。各浏览器实现有差别(IE忽略不可打印字符,Chrome在此基础上忽略0x00和NUL空字符,大 多数浏览器会忽略协议名中的换行和制表符,Opera接受在协议字符串中出现高位字符)

 

层级URL标记符号

RFC1738规定:每个层级结构的绝对URL应包含固定字符串"//"

层级URL示例:http://example.com

非层级URL示例:mailto:user@example.com?subject=Hello+world

上述规定对以下情况作何处理未明确:

  • 非层级URL带有"//"
  • 层级URL不带有"//"

在之后的RFC3986中出于兼容性考虑,允许解析这类URL

  • http:example.com/   没有符合要求的基准URL环境,Firefox、Chrome和Safari将其等同于http://example.com,有基准URL,认为是指向目录example.com的相对路径

访问资源的身份验证

对不支持身份验证的协议,如果URL中强行添加了这部分信息该如何处理,协议未做规定

若未提供身份验证信息,浏览器默认以匿名形式获取数据(HTTP和其他几种协议这意味着没有传送任何身份验证信息;对FTP协议,这包含一个名为ftp的帐号和一个假的密码)

服务器地址

服务器地址部分:

  • 不去分大小写的域名
  • 一个IPv4地址
  • 在一对方括号中的IPv6地址

RFC中只允许符合规范的IP地址的写法,然而大部分应用依赖的标准C类库比较灵活,可以接受八进制、十进制、十六进制,甚至可以把其中几个或全部8位元数据拼接在一起再转化成单个整数

 

  • http://127.0.0.1/         IPv4正规写法,点分十进制
  • http://0x7f.0x00.0x00.0x01
  • http://0x7f.1/            与上面是同一个地址,0x7f是127的十六进制写法,剩下的1是0.0.1三个数据分别写成16进制后拼接再转化成一个十进制的数
  • http://017700000001/      还是同一个地址,以0为前缀,后面是把127.0.0.1四个数的十六进制拼接后转换成8进制形成的单个的八进制整数
对于域名,理论上它能使用的字符集为字母、数字、“."、和“-“。

 

服务器端口

服务器端口是可选的,通常在网络端口是非标准端口时才会用到。基本上浏览器支持的所有协议及第三方应用都会以TCP或UDP作为传输方式,TCP和UDP都依赖于一个16位端口来区分一台机器上的不同服务,服务器上的每种协议都关联一个默认的服务端口

层级文件路径

支持"/../"和"/./"格式的相对路径

查询字符串

用于把一串非层级格式的任意参数传递给由前面路径所对应的资源。如下示例将用户提供的信息传递给服务器脚本

http://example.com/search.php?query=Hello+World

浏览器处理HTML文件的表单时会生成如下格式的查询字符串

  name1=value1&name2=value2...

但这并不是强制的

Fragment ID

用于客户端而非服务器端

用途:指向HTML页面的某个锚点名称,用于页面浏览定位。(如果URL里的锚点名称于HTML页面里面设定的锚点标签匹配,文档滚动到该定位标签位置)

 


解析URL

1. 提取协议名称

    第一个“:”字符左边是协议名称,如果其中有不应有的字符,则它可能是相对URL而不是协议名称

2. 取出层级URL标记符

    “//”跟在协议后面,如果发现,跳过;没有发现,不去管。(URL标记符在某些环境下可能不用“/”,用一个、两个甚至三个以上“/”,很多浏览器接受”\“代替”/“)

3. 获取授权信息部分

    一次扫描”/“、”?“或”#“(另”\“也需考虑),哪个先出现以哪个为准进行截取(分号在某些浏览器中也是授权信息部分接受的分隔符)

  a. 如果有,定位登录信息:如果存在@符号,其前面是登录信息(登录信息的“:”前面是用户名,后面是密码数据)

  b. 提取目标地址:剩下部分是目标地址,第一个“:”分割了主机名和端口

4. 确定路径

    授权部分结尾的“/”(“\“,”;“如果支持的话)和之后第一个出现的”?“、“#”或字符串结尾之间的部分即路径部分,将其根据UNIX路径予以进行规范化处理

5. 提取查询字符串

    上一条解析结尾是“?“,则该”?“和之后出现的第一个”#“或字符串结尾之间的部分未查询字符串

6. Fragment ID

    成功解析上一条信息之后跟着“#”,则该”#“后面剩下的部分未Fragment ID 

 

http://example.com&gi&name=abc@167772161

按照上面介绍的方法解析得正确的主机地址应该为10.0.0.1(167772161 -> 0xa0000001 -> 0xa0.0x00.0x00.0x01 -> 10.0.0.1)

http://example.com\@abc.cx/

对于支持“\“作为分隔符的浏览器上述URL解析得到的主机地址为example.com,对于其他,解析为abc.cx


原则上在url中应该被禁止的字符有:/?#[]@(url的语义分隔符)和!$&'()*+,;=(底层分隔符)

需要使用它们时,可使用百分号编码(或称为URL编码)

非保留字符集(字母数字 - . _ ~),只有这个子集里的字符和位于正确功能位置上的保留字符才允许出现在URL里

 

  • 规定里未禁止非保留字符不能以编码形式出现 

 

posted @ 2014-07-17 14:00  LOTUS2014  阅读(262)  评论(0编辑  收藏  举报