[译]学习HTTP协议的请求行
原文:http://fiddler2.com/blog/blog/2013/02/13/understanding-the-request-line
最近有一位Fiddler用户问我一个问题:
我在使用Fiddler查看HTTP请求的时候发现Raw和HexView两个面板中显示的数据有点小区别,比如当我请求www.microsoft.com时,Raw面板中的数据是这样的:
GET http://www.microsoft.com/ HTTP/1.1
...
Host: www.microsoft.com而HexView面板中是这样的:
GET / HTTP/1.1
...
Host: www.microsoft.com为什么请求行(Request Line)中的文本不一样?我还发现如果我使用socket直接发送这样一个使用绝对路径的GET请求(不经过Fiddler),一些服务器会返回错误信息.
原理是这样的.当客户端比如浏览器认为自己在向一个代理服务器发送HTTP请求时,它会在请求行中使用绝对路径的URL.如果它认为自己在向目标服务器直接发送请求,则请求行中只会包含相对路径的URL(完整URL的path部分).这正是遵循了RFC2616 (5.1.2小节)标准的规定.遵照标准,服务器必须能正确解析这两种形式的请求行.但正如上面问题中提到的,有些服务器不能正确解析请求行中包含绝对路径的情况,会返回HTTP/4xx或者HTTP/5xx错误.
提问者遇到的情况,正是浏览器向Fiddler发送了请求行为GET http://www.microsoft.com/ HTTP/1.1的请求(因为Fiddler也是个代理),然后Fiddler将其中的请求行改写成了GET / HTTP/1.1,再发送给服务器.
Fiddler的检查器(Inspector)中的各个面板能够自由选择在请求行中显示绝对路径还是相对路径,每种选择都有各自的好处.显示绝对路径能够让用户更方便的查看,修改(需要开启Unlock for editing),以及链接化请求地址(Raw面板中),而显示相对路径更符合实际情况,因为Fiddler发送给服务器的请求最终都是使用相对路径的.
译者注:在最新的Fiddler版本中,不管Fiddler接受到的请求中的请求行使用绝对路径还是相对路径,Fiddler都会在各个面板中显示绝对路径(也就是说提问中两个面板显示数据不同的这个表现已经不存在了),而发送的真实数据会使用相对路径.
总结一下就是,Fiddler中看到的请求数据并不一定是客户端发送的真实数据,Fiddler最后发送的请求数据也不一定是你在Fiddler中看到的那样.
有些情况下,我们需要看到客户端发送的真实的请求数据,一点也不能经过篡改.我们就得使用真正的抓包软件,而不是代理,比如SmartSniff.
有些情况下,我们希望我们构造的HTTP请求不经任何修改的发送给服务器,这时就不能使用Fiddler自带的composer了,你可以使用命令行的telnet程序,还可以使用我自己写的一个小工具,叫HTTP Request Builder.这个工具的特点是,请求数据使用socket直接发送(没有使用.net中更高级的封装类).因此就不会有任何的格式限制和异常捕获,你甚至可以去谷歌的主机上请求百度的网站,想要的却是淘宝首页:
使用这个工具,可以验证一下原文中所说的Fiddler是否的确会修改请求行中的URL,可以这样构造请求:
之后在Fiddler中的Raw和HexView两个面板中看看,都是绝对URL.
![]()
而在抓包软件中看到的,也就是Fiddler真正发送出去的请求,是篡改后的相对URL.
[译]学习HTTP协议的请求行的更多相关文章
- HTTP协议的请求和响应学习
本篇作为学习servlet的前提,http协议是学习JavaWeb开发的基石,不深入了解http协议,就不能说掌握了JavaWeb开发. HTTP协议有两个版本:HTTP1.0和HTTP1.1,那么有 ...
- HTTP 笔记与总结(2 )HTTP 协议的(请求行的)请求方法 及 (响应行的)状态码
(请求行的)请求方法 包括: GET,POST,HEAD,PUT,TRACE,DELETE,OPTIONS 注意:这些请求方法虽然是 HTTP 协议规定的,但是 Web Server 未必允许或支持这 ...
- Http协议入门、响应与请求行、HttpServletRequest对象的使用、请求参数获取和编码问题
1 课程回顾 web入门 1)web服务软件作用: 把本地资源共享给外部访问 2)tomcat服务器基本操作 : 启动: %tomcat%/bin/startup.bat 关闭: %tomcat%/ ...
- HTTP协议图--HTTP 报文首部之请求行、状态行
1.请求行 举个栗子,下面是一个 HTTP 请求的报文: GET /index.htm HTTP/1.1 Host: sample.com 其中,下面的这行就是请求行, GET /index.htm ...
- Http的请求协议请求行介绍
请求协议包含的内容 请求行 GET /day04-tomcat/index.jsp HTTP/1.1 HTTP/1.1: 表示的是我们使用的是http协议的1.1版本 请求头 请求空行 请求体: 存储 ...
- Web协议详解与抓包实战:HTTP1协议-详解请求行(2)
一.请求行一 二.请求行二 三.请求行三 四.常见方法(RFC7231) 实际测试截图 五.用于文档管理的 WEBDAV 方法(RFC2518) 六.WEBDAV 验证环境 1.登录 2.Wire ...
- JavaWeb学习----http协议
一.什么是HTTP协议: 1.概念: 客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式(规定客户端和服务器如何 ...
- 深入浅出学习HTTP协议
之前学习javaWeb只是大致了解了一下,今天重点介绍下http请求,当是复习吧! 一.http基础概念 1.什么是http协议? HTTP是Hyper Text Transfer Protocol( ...
- IP封包协议头/TCP协议头/TCP3次握手/TCP4次挥手/UDP协议头/ICMP协议头/HTTP协议(请求报文和响应报文)/IP地址/子网掩码(划分子网)/路由概念/MAC封包格式
IP协议头IP包头格式: 1.版本号:4个bit,用来标识IP版本号.这个4位字段的值设置为二进制的0100表示IPv4,设置为0110表示IPv6.目前使用的IP协议版本号是4. 2.首部长度:4个 ...
随机推荐
- ElasticSearch集群设置
多台机器 \config\elasticsearch.yml 文件修改 cluster.name设置统一的集群名如 cluster.name: win-es-001 node.name 设置当前Nod ...
- [WPF系列]-数据邦定之DataTemplate 根据对象属性切换模板
引言 书接上回[WPF系列-数据邦定之DataTemplate],本篇介绍如何根据属性切换模板(DataTemplate) 切换模板的两种方式: 使用DataTemplateSelecto ...
- Neutron 理解 (6): Neutron 是怎么实现虚拟三层网络的 [How Neutron implements virtual L3 network]
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- Log4j
[1]从零开始 a). 新建Java Project>>新建package>>新建java类: b). import jar包(一个就够),这里我用的是log4j-1.2.14 ...
- iis上如何架设HTTPS网站
对于HTTPS网站,大部分都比较陌生,觉得很难,其实只要申请好证书,只要在服务器上做下小配置就可以完成 首先,申请一个ssl证书 免费申请https://buy.wosign.com/free/Fre ...
- .Net下几个服务框架介绍
简介 在公司的服务多了以后,为了调用上的方便,同时为了以后的服务治理,一般都会使用一些服务框架,这里主要介绍我知道的几个服务框架,简析一下这些服务框架的基本概念. 可投入生产环境使用的 以下两个服务框 ...
- 代码批量生成WORD的遇到的问题及解决
好久没搞工具了,最近因为处理大规模公文处理单文档,自己写了个批量处理WORD的程序:在调试过程中,主要遇到两个问题 第一个是WORD的模板 数据很多,但是WORD模板只需要一个,将数据替换WORD里标 ...
- 【Jquery】$.Deferred 对象
源:http://www.ruanyifeng.com/ deferred三个状态 “已完成”“未完成”“已失败” (1) $.Deferred() 生成一个deferred对象. ...
- 【JavaScript】【CSS】前端规则摘抄
源:http://zhibimo.com
- Android BLE 蓝牙编程(一)
最近在研究这个,等我有时间来写吧! 终于在端午节给自己放个假,现在就来说说关于android蓝牙ble的 最近的学习成果吧!! 需要材料(写个简单教程吧--关于小米手环的哦!嘿嘿) Android 手 ...



