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 | 方案特有 |
路径 | 服务器的资源本地名,路径组件语法和服务器、方案相关 | 无 |
参数 | 使用该组件指定输入参数。参数为名/值对,用分号隔开 | 无 |
查询 | 用于激活应用程序,没有通用格式 | 无 |
片段 | 部分资源名称,引用时不会传递给服务器,只使用于客户端内部。 | 无 |
方案
方案是规定如何访问指定资源的主要标识符。要求以字母开始,用:隔开URL其余部分,且大小写无关。主机和端口
主机标志能访问资源的服务器。主机可以使用主机名或者IP地址来访问;端口则标识服务器监听的网络端口,默认为80。用户名和密码
多用在FTP服务器上。如果URL方案要求提供用户名和密码,而用户没有输入,则应用程序会插入一个默认的用户名和密码,随浏览器而定路径
其说明资源在服务器中的位置,是服务器定位资源时需要的信息,用/将路径划分为路径段(path segment),路径段还有各自的参数组件。参数
服务器需要更多的信息,而不是简单的主机名和路径,而URL中的参数组件可以提供更多的协议参数。该组件是名值对列表,每个路径段可以有多个参数,形式类似:http://www.baidu.com/pub/gnu;type=sb【并不存在,请勿当真】
这里的路径段gnu参数为type,值为sb。
查询字符串
用于缩小请求资源类型范围。如本专栏撰写时,网址为:http://segmentfault.com/write?freshman=1
其中的
freshman=1
就是查询组件。我猜测,这个查询组件的意思是:在服务器的write路径中,是否一直保存着我的文章的草稿。查询组件会发送给网关,由网关做进一步处理。如果需要多个名值对,则使用&字符进行分割。片段
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;二是解析相对引用。
找出基础URL
基础URL来源有二:一是网页显式指定,如在HTML网页中,使用<BASE>标记指定基础URL;二是隐式指定,封装所属资源的URL,我们举的例子即为如此。解析相对引用
对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权威指南:第二章
HTTP权威指南:第二章的更多相关文章
- Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句
第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...
- 【笔记】javascript权威指南-第二章-词法结构
词法结构 //本书是指:javascript权威指南 //以下内容摘记时间为:2013.7.28 字符集 UTF-8和UTF-16的区别?Unicode和UTF是什么关系?Unicode转义 ...
- JavaScript权威指南 第二章 词法结构
这章主要把保留字说一下 JavaScript 把一些标识符拿出来用做自己的关键字.因此,就不能再在程序中把这些关键字用做标识符了: break delete function return typeo ...
- WindowsPE权威指南 第二章 小工具 PEInfo代码的C语言实现
主程序代码 PEInfo.c #include <Windows.h> #include<Richedit.h> #include "resource.h" ...
- WindowsPE权威指南 第二章 小工具 PEComp代码的C语言实现
主程序代码 PEComp.c #include <windows.h> #include <Richedit.h> #include <Commctrl.h> #i ...
- WindowsPE权威指南 第二章 小工具 pedump代码的C语言实现
2016-11-16 16:29:07 主程序代码 pedump.c #include <windows.h> #include <Richedit.h> #include & ...
- HTTP 权威指南 第二章 URL 与资源
前言 这一章节讲述了关于 URL 的相关知识,主要包括下面的内容: URL 语法 URL 快捷方式 URL 编码与字符规则 常见的 URL 方案 URL 的未来——URN URL 语法 一般格式(九个 ...
- PADSPCB权威指南-第一章 PADS软件系统(部分)(原创)
PADSPCB权威指南-第一章(部分)豆丁地址:http://www.docin.com/p-707128286.html
- Knockout应用开发指南 第二章:监控属性(Observables)
原文:Knockout应用开发指南 第二章:监控属性(Observables) 关于Knockout的3个重要概念(Observables,DependentObservables,Observabl ...
- Tomcat权威指南(第二版)下载pdf 高清完整中文版-百度云下载
本书是一本万能工具,其主题涵盖了Apache Tomcat这一广受欢迎的开源servlet.JSP容器和高性能的web server. <Tomcat权威指南>对管理员和web站点管理员而 ...
随机推荐
- Docker入坑系列(一)
Docker入坑系列(一) 引用嘛,当然是来引用别人说的东西啦. Docker 是一个开源项目,诞生于 2013 年初,它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux ...
- Python:Dict
0.运算符 in:检查字典中是否有某个key 'a' in {'a':1,'b':2} True 提取其中Key对应的Value: d={'1':'A','2':'B','3':'C'} d['2'] ...
- Java变量,作用域,常量
JAVA变量,作用域,常量 变量 变量是什么:就是可以变化的量! Java是一种强类型的语言,每变量都必须声明其类型. Java变量是程序中最基本的存储单元,其要素包括:变量名,变量类型和作用域 格式 ...
- Angular + asp.net core 入门
一.简介 通俗的理解,Angular 只是一个前端框架,它只负责前端的事,但一个完整的项目还应该有后端,这其中之一可选的技术就是 asp.net core .这里简单学习一下两个框架之间的协同开发. ...
- a 标签 href 失效 和ajax的类型
Jquery Ajax type的4种类型 Ajax type这个里面填什么呢?通常大家都会说get和post.那么还有2个是什么呢 $.ajax({ url: 'http://www.cnblo ...
- Spark ML源码分析之三 分类器
前面跟大家扯了这么多废话,终于到具体的机器学习模型了.大部分机器学习的教程,总要从监督学习开始讲起,而监督学习的众多算法当中,又以分类算法最为基础,原因在于分类问题非常的单纯直接,几乎 ...
- Qt记事本,美化版
主体代码实现 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QMenu> ...
- 开启路由器的TCP拦截
TCP拦截即TCP intercept,大多数的路由器平台都引用了该功能,其主要作用就是防止SYN泛洪攻击.SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击 ...
- 更新或添加properties文件(保留存在的properties文件的原有格式)
转载: https://www.cnblogs.com/wangzhisdu/p/7815549.html import java.io.BufferedWriter; import java.io. ...
- go语言学习入门篇 2--轻量级线程的实现
很多有过 JVM 相关语言工作经验的程序员或许都遇到过如下问题: 超出 thread 限制导致内存溢出.在作者的笔记本的 linux 上运行,这种情况一般发生在创建了 11500 个左右的 threa ...