URL是因特网资源的标准化名称,该字符串指向一条电子信息片段,定义服务端应用程序在什么位置以及客户端要如何与其交互
一条完整的URL由多个片段组成。
通用URL组件
方案 | 以哪种协议访问服务器 |
用户 | 某些方案访问资源时需要用户名 |
密码 | 用户名之后可能需要密码 |
主机 | 资源宿主服务器的主机名或IP地址 |
端口 | 资源宿主服务器正在监听的端口号 |
路径 | 服务器上资源的本地名,由一个斜杠(/)将其与前面的URL组件分开。路径组件的语法是服务器和方案有关 |
参数 | 某些方案会用参数组件来指定输入参数。参数由名/值对组成且可以有一个或多个(多个参数用;分开) |
查询 | 用字符?将其与其他组件分开。某些方案用于这个组件传递参数以激活应用程序,比如查询数据库 |
片段 | 一小片或一部分资源的名字。引用对象时,不会将frag字段传递给服务器,这个字段是在客户端内部使用的,通过#与其他组件分开 |
相对URL
URL有两种,一种是刚才见到的绝对URL(包含访问资源所需的全部信息),另外一种是相对URL。
相对URL对绝对URL来讲是不完整的字符串。要想从相对URL中获取访问资源的全部信息,就必须相对于另一个被称为基础的URL进行解析。
转换处理的第一步就是找到基础的URL,基础URL是作为相对URL的参考点使用的,可以来自以下几个地方。
1:在资源中查询:有些资源会显式的指定基础URL,比如在HTML里定义<base>标签
2:封装资源的基础URL:如果在没有显式指定基础URL的资源中发现了一个相对URL,可以将他所属资源的URL作为基础。
3:没有基础URL:某些情况下,没有基础URL,这通常意味着你又一个绝对URL;但也有可能只是一个损坏了的不完整的URL。
解析相对引用
了解了URL的组件和语法之后,就可以使用以下方案算法将相对URL转换成绝对URL
字符集和编码
由于URL需要统一命名因特网上的所有资源,也就意味着要通过不同的协议来传送这些资源。这些协议在传送资源时使用了不同的机制。不同的机制会有不同的保留字符作为关键字。所以URL在作为资源传送的纽带,只能使用一些相对较小、通用的安全字符组成能够各种协议所能识别的URL,URL不仅能被所有传输协议所使用外,还希望URL是人类可阅读的。因此,即使不可见,不可打印的字符能够程序传送,也不能在URL中使用。另外URL还必须是完整的。URL不仅使用通用的安全字符组成URL表达式,还会使用二进制数据或者字符。因此需要使用一种转义机制。能够将不安全的字符编码为安全字符,再进行传输。
总结:URL的组成需要满足三个条件
一:具有通用,能被各种协议使用
二:具有可读性
三:安全性,字符编码
字符集
URL默认使用US-ASCII作为字符集。US-ASCII使用7位二进制码来表示英文打字机提供的大多数按键和少数用于文本格式和硬件通知的不可打印控制字符
字符编制
通过使用“转义”表示法来表示不安全字符,转义包含一个百分号%,后面跟两个表示字符ASCII的十六进制数。
编码示例
字符 | ASCII码 | 示例URL |
~ | 126(0X7E) | http://www.joes-hardware.com/%7Ejoe |
限制使用的一些字符
由于有的字符在使用中有特殊含义被作为保留字使用且有的字符不在定义的US-ASCII可打印字符集中,除此以外还有字符会与某些因特网网关和协议产生混淆。所以在定义URL时应避免使用这些字符。