HTTP权威指南:第二章

URL概览

前面提到,URL资源是HTTP协议所使用的寻找资源位置的定位符。分为三个部分,主要的结构是:

方案://服务器/路径

这种结构使得网络上的每一个资源都只有唯一的命名方法,从而使得浏览器可以统一对不同的资源进行处理,而不是依赖不同的软件。
URL可以从以下几个部分去了解:

  • 语法
  • 快捷方式
  • 特殊字符
  • 方案

最后,我们还会展望未来,看看URN——URL的下一代。


一、语法

URL语法是跟对方案而变化的,但是这些变化总是建立在URL语法的9个组件组成的通用格式之上的。这个通用格式是:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

这9个组件不需要全部包含,其中重要的三个部分是之间提到的:方案、主机路径。其可总结如下:

方案 描述 默认值
方案 使用的协议
用户 某些方案访问资源时要求的用户名 匿名
密码 在用户名之后,中间以冒号:隔开 <E-mail地址>
主机 服务器的主机名或者点分IP地址(如192.168.1.1)
端口 服务器监听的端口,HTTP默认端口为80 方案特有
路径 服务器的资源本地名,路径组件语法和服务器、方案相关
参数 使用该组件指定输入参数。参数为名/值对,用分号隔开
查询 用于激活应用程序,没有通用格式
片段 部分资源名称,引用时不会传递给服务器,只使用于客户端内部。
  1. 方案
    方案是规定如何访问指定资源的主要标识符。要求以字母开始,用:隔开URL其余部分,且大小写无关。
  2. 主机和端口
    主机标志能访问资源的服务器。主机可以使用主机名或者IP地址来访问;端口则标识服务器监听的网络端口,默认为80。
  3. 用户名和密码
    多用在FTP服务器上。如果URL方案要求提供用户名和密码,而用户没有输入,则应用程序会插入一个默认的用户名和密码,随浏览器而定
  4. 路径
    其说明资源在服务器中的位置,是服务器定位资源时需要的信息,用/将路径划分为路径段(path segment),路径段还有各自的参数组件。
  5. 参数
    服务器需要更多的信息,而不是简单的主机名和路径,而URL中的参数组件可以提供更多的协议参数。该组件是名值对列表,每个路径段可以有多个参数,形式类似:
    http://www.baidu.com/pub/gnu;type=sb【并不存在,请勿当真】

    这里的路径段gnu参数为type,值为sb。

  6. 查询字符串
    用于缩小请求资源类型范围。如本专栏撰写时,网址为:
    http://segmentfault.com/write?freshman=1

    其中的freshman=1就是查询组件。我猜测,这个查询组件的意思是:在服务器的write路径中,是否一直保存着我的文章的草稿。查询组件会发送给网关,由网关做进一步处理。如果需要多个名值对,则使用&字符进行分割。

  7. 片段
    HTML资源除了资源级,还可以进一步划分。比如指定文档中的某个章节。而这个就可以使用#<frag>实现了。以本专栏的第一篇文章为例,旁边的文章目录实际上是在点击以后,为网址加上一个片段,如#articleHeader6实现的跳转。这样,浏览器可以在获得整个资源以后,显示你感兴趣的部分。

二、快捷方式

这个快捷方式是针对客户端的,可以分为相对URL和URL自动拓展。

相对URL

前面提到的都是绝对URL,包含访问资源所需要的全部信息。而相对URL则是不完整的,必须相对另一个作为基础(base)的URL进行解析。这种便捷的缩略法为写网页的人省了不少心。如下面的HTML代码片段:


    <ul class="menu list-inline pull-left hidden-xs">
                    <li class="menu__item"><a href="/questions">问答</a></li>
                    <li class="menu__item"><a href="/blogs">文章</a></li>
                    <li class="menu__item"><a href="/user/note">笔记</a></li>
                    <li class="menu__item"><a href="/jobs">职位</a></li>
                    <li class="menu__item"><a href="/events">活动</a></li>
                </ul>

其中的问答、文章等超链接都是http://segmentfault.com/a/1190000004341687#articleHeader6为基础URL,从而推导出方案和主机名。
所以,相对URL优势有二:

  • 可以保持HTML文档的可读性和书写便捷。
  • 可以保持网页上一组资源的便携性。、
    比如,可以在搬移一组文档时,保持链接的有效性。这样,就可以方便的搭载镜像服务器了。

使用相对URL的步骤有二:一是找出基础URL;二是解析相对引用。

  1. 找出基础URL
    基础URL来源有二:一是网页显式指定,如在HTML网页中,使用<BASE>标记指定基础URL;二是隐式指定,封装所属资源的URL,我们举的例子即为如此。
  2. 解析相对引用
    对URL进行转换,需要将相对URL和基础URL划分成组件段,或者说“分解(decomposing)”。解析完URL后,可以获得一个个组件,根据相对URL的完整程度,逐步对其进行填充,直到组合成新的绝对URL。这个填充是使用的是一个在RFC2396中定义的算法。

URL自动拓展

浏览器会为用户提供一条捷径,使得用户不需要输入完整的URL,而交给浏览器填充。其方式有二:主机名拓展和历史拓展。

  • 主机名拓展
    根据主机名进行拓展,找到匹配站点则构建成功;失败则再次尝试其他可能。但是这种拓展可能会为一些其他HTTP应用程序(如代理)带来问题。
  • 历史拓展
    根据用户访问过的历史URL进行拓展,该拓展通过选择来完成。

三、特殊字符

为了保障URL的可移植性(即使用任何因特网协议都可以安全传输)和完整性,URL需要:

  • 使用通用的安全字母表
  • 对不可见字符进行编码以传送
  • 包含不安全的字符

为了实现这点,URL使用了通用字母表,并增加了一些编码规则。

URL字符集

URL中继承了ASCII字符集和转义序列,使得其可以使用优先子集对任意字符值进行编码。

编码机制

通过“转义”表示法,表示不安全字符。其包含一个百分号(%)和两个表示字符ASCII码的十六进制数。示例如下:

字符 ASCII码 示例URL
~ 0x7E http://www.joes-hardware.com/%7Ejoe
(空格) 0x20 http://www.joes-hardware.com/more%20tools.html
% 0x25 http://www.joes-hardware.com/100%25satisfaction.html

字符限制

在URL中,字符会因为有特殊含义、非ASCII可打印字符或者混淆协议和网关而被限制。下面是一些被限制的字符:

字符 保留/受限
% 保留为转义标志
/?#:; 保留为定界符
. 保留在路径组件中使用
.. 同上
$+ 保留(不需要理由)
@&= 在不同的方案的上下文中有特殊含义,保留
{}[]~\^‘| 用于各种传输Agent代理,使用受限
<>" 不安全,在URL范围之外是有意义的,需要进行编码
0x00-0x1F,0x7F 受限,因为是不可打印字符
0x7F 受限,因为不在US-ASCII字符集的7二进制位范围之内

额外说明

对于不安全字符,最好进行编码。而判断是否进行编码则由从用户处获取URL的源端应用来做。URL中,可能有人故意对额外的字符进行编码,从而绕过对URL进行模式匹配的应用。所以,解释URL的应用必须在处理URL之间进行编码。


四、方案

下面是Web常用方案的一些格式:

方案 描述
http 超文本传输协议。没有用户名和密码,除此之外符合通用URL,端口默认为80.
https 与http相对使用了网景的SSL,为HTTP提供端到端的加密机制,端口默认为443
mailto 指向E-mail地址。标准格式与URL格式不同,其语法记录在RFC822中。
ftp 文件传输协议、要求用户名和密码,可以上传、下载文件,并获取其目录结构内容
rtsp,rtspu 通过实时流传输协议解析的多媒体资源标识符。除了方案部分,其余同上。
file 表示一台指定主机上可以直接访问的文件,省略主机名则默认为本机
news 由RFC036定义,访问特定的文章或者新闻组。其自身包含的信息不足以对资源进行定位,其实际上与位置无关,只保留字符@来区分指向新闻组和指向新闻文章的URL
telnet 访问交互式业务,表示可以通过telnet访问的交互式应用程序

五、未来的方向

实际上,由于URL表示的实际的地址,所以在资源被移动以后,无法定位对象。所以,下一代标准URN(统一资源名)开始研究,通过一个永久统一资源定位符PURL,使用URL实现URN的功能。可以在PURL中获取更多信息。



最后的彩蛋,猜猜这个是哪个网页的源代码?


    <!--[if lt IE 9]>
    <div class="alert alert-danger topframe" role="alert">你的浏览器实在<strong>太太太太太太旧了</strong>,放学别走,升级完浏览器再说 <a target="_blank" class="alert-link" href="http://browsehappy.com">立即升级</a>
    </div>
    <![endif]-->
    

本文转载于:HTTP权威指南:第二章

原文地址:https://www.cnblogs.com/10manongit/p/12657761.html

时间: 2024-10-15 20:52:37

HTTP权威指南:第二章的相关文章

Hadoop权威指南---第二章MaxTemperature例题源码

敲了一下hadoop权威指南第二章的例题,虽然基本上是照着书上敲的,但还是把它放到这方便以后查看. 代码如下: <span style="font-size:18px;"><span style="font-size:18px;">import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration;

JavaScript权威指南 第二章 词法结构

这章主要把保留字说一下 JavaScript 把一些标识符拿出来用做自己的关键字.因此,就不能再在程序中把这些关键字用做标识符了: break delete function return typeof case  do     if switch var catch else in this void continue false instanceof throw while debugger finally new true with default for null try JavaScr

Kali Linux 无线渗透测试入门指南 第二章 WLAN 和固有的不安全性

第二章 WLAN 和固有的不安全性 作者:Vivek Ramachandran, Cameron Buchanan 译者:飞龙 协议:CC BY-NC-SA 4.0 简介 建筑越高,地基就要打得越深. – 托马斯·坎佩斯 没有什么伟大的东西能在脆弱的基础上构建.在我们的语境中,固有的不安全性之上不能构建出安全. WLAN 在设计上拥有特定的不安全性,它们可被轻易利用,例如,通过封包注入,以及嗅探(能够在很远处进行).我们会在这一章利用这些缺陷. 2.1 回顾 WLAN 帧 由于这本书处理无线方面

高可用高性能负载均衡软件HAproxy详解指南-第二章(配置文件、关键字、ACL)

第二章:HAproxy配置文件详解以及HAproxy的ACL详解 对Linux有兴趣的朋友加入QQ群:476794643 在线交流 本文防盗链:http://zhang789.blog.51cto.com 上一篇:第一章:HAproxy简介及安装配置 目录 haproxy 配置文件详解 haproxy 配置文件中的关键字参考 haproxy的ACL 附:一份完整的HAproxy的配置文件 由于字体过多分开写的,全系列文章链接 第一章:HAproxy简介及安装配置 http://zhang789.

R 学习笔记《五》 R语言初学者指南--第二章总结

第二章学习了的R函数: 1 sum                     计算和 sum(x,na.rm=TRUE)  计算向量x中所有数的和,其中排除了NA元素 2 median                 计算中位数           返回一个样本数据中间的那个数  median(x,na.rm=TRUE) 3 max                    计算最大值            max(x,na.rm=TRUE) 4 min                    计算最小

机试指南第二章-经典入门-Hash的应用自解

Hash的应用: Hash即散列,不像数据结构与算法中讲的各种Hash方法和冲突处理等过多的阐述,以下主要介绍Hash在机试试题解答中的作用. 例2.5 统计同成绩学生人数 Hash解法AC代码:(一般想到的也是这种解法) #include<cstring> #include<iostream> using namespace std; int grade[105]; int main() { int n, m, index; memset(grade, 0, sizeof(gra

MongoDB权威指南第二版学习笔记二

数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和false {“x”:true} 数值 shell默认使用64位浮点型数值. {“x”:3.14} 或 {“x”:3} 对于整型值,可使用NumberInt类(表示4字节带符号整数)或NumberLong类(表示8字符带符号整数) {“x”:NumberInt(”3”)} {“x”:NumberLong(

MongoDB权威指南第二版学习笔记——MongoDB简介

MongoDB简介 MongoDB在功能和复杂性之间取得了很好的平衡,并且大大简化了原先十分复杂的任务,它具备支撑今天主流web应用的关键功能:索引.复制.分片.丰富的查询语法,特别灵活的数据模型.与此同时还不牺牲速度. MongoDB是一款强大.灵活,且易于扩展的通用型数据库.能扩展出非常多的功能,如二级索引.范围查询.排序.聚合,以及地理空间索引. 设计特点 易于使用 MongoDB是一个面向文档的数据库,比关系型数据库有更好的扩展性.用文档代替行.能够仅使用一条记录来表现发展的层次关系.

[已读]HTML5与CSS3权威指南第二版(下)

去年下半年前公司给买的(老付对我们确实蛮好的),一人挑一本,我当时一定是秀逗了.看的时候就发现,这本书的内容过时严重,即便它是新出不久的第.二.版.其他没什么说的,总之,不推荐看.

MongoDB权威指南第二版学习笔记(四)—增删改文档下

$slice 如果希望数组的最大长度是固定的,那么可以将 $slice 和 $push 组合在一起使用,就可以保证数组不会超出设定好的最大长度.$slice 的值必须是负整数. 假设$slice的值为10,如果$push 后的数组的元素个数小于10,那么所有元素都会保留.反之,只有最后那10个元素会保留.因此,$slice 可以用来在文档中创建一个队列. db.class.insert({"班级":"1班"}) WriteResult({ "nInsert