首页 > 代码库 > URL

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地址

服务器端口

服务器端口是可选的,通常在网络端口是非标准端口时才会用到。基本上浏览器支持的所有协议及第三方应用都会以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