原文: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协议的请求行的更多相关文章

  1. HTTP协议的请求和响应学习

    本篇作为学习servlet的前提,http协议是学习JavaWeb开发的基石,不深入了解http协议,就不能说掌握了JavaWeb开发. HTTP协议有两个版本:HTTP1.0和HTTP1.1,那么有 ...

  2. HTTP 笔记与总结(2 )HTTP 协议的(请求行的)请求方法 及 (响应行的)状态码

    (请求行的)请求方法 包括: GET,POST,HEAD,PUT,TRACE,DELETE,OPTIONS 注意:这些请求方法虽然是 HTTP 协议规定的,但是 Web Server 未必允许或支持这 ...

  3. Http协议入门、响应与请求行、HttpServletRequest对象的使用、请求参数获取和编码问题

    1 课程回顾 web入门 1)web服务软件作用: 把本地资源共享给外部访问 2)tomcat服务器基本操作 : 启动:  %tomcat%/bin/startup.bat 关闭: %tomcat%/ ...

  4. HTTP协议图--HTTP 报文首部之请求行、状态行

    1.请求行 举个栗子,下面是一个 HTTP 请求的报文: GET /index.htm HTTP/1.1 Host: sample.com 其中,下面的这行就是请求行, GET /index.htm ...

  5. Http的请求协议请求行介绍

    请求协议包含的内容 请求行 GET /day04-tomcat/index.jsp HTTP/1.1 HTTP/1.1: 表示的是我们使用的是http协议的1.1版本 请求头 请求空行 请求体: 存储 ...

  6. Web协议详解与抓包实战:HTTP1协议-详解请求行(2)

    一.请求行一 二.请求行二 三.请求行三 四.常见方法(RFC7231) 实际测试截图 五.用于文档管理的 WEBDAV 方法(RFC2518) 六.WEBDAV 验证环境  1.登录  2.Wire ...

  7. JavaWeb学习----http协议

    一.什么是HTTP协议: 1.概念: 客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式(规定客户端和服务器如何 ...

  8. 深入浅出学习HTTP协议

    之前学习javaWeb只是大致了解了一下,今天重点介绍下http请求,当是复习吧! 一.http基础概念 1.什么是http协议? HTTP是Hyper Text Transfer Protocol( ...

  9. IP封包协议头/TCP协议头/TCP3次握手/TCP4次挥手/UDP协议头/ICMP协议头/HTTP协议(请求报文和响应报文)/IP地址/子网掩码(划分子网)/路由概念/MAC封包格式

    IP协议头IP包头格式: 1.版本号:4个bit,用来标识IP版本号.这个4位字段的值设置为二进制的0100表示IPv4,设置为0110表示IPv6.目前使用的IP协议版本号是4. 2.首部长度:4个 ...

随机推荐

  1. MongoDB学习笔记(二:入门环境配置及与关系型数据库区别总结)

    一.下载及安装MongoDB MongoDB下载官网链接:http://www.mongodb.org/downloads 具体安装步骤教程:http://www.shouce.ren/api/vie ...

  2. 架构实例之SpringTest

    架构实例之SpringTest 1.开发工具和开发环境       开发工具: MyEclipse10,JDK1.6.0_13(32位),Tomcat7.0(32位),mysql5.7.13 开发环境 ...

  3. J2EE基础之Web服务简介

    J2EE基础之Web服务简介 1.什么是Web服务? 在人们的日常生活中,经常会查询网页上某城市的天气信息,这些信息都是动态的.实时的,它是专业的气象站提供的一种服务.例如,在网上购物时,通常采用网上 ...

  4. 数字图像处理中的4邻接,8邻接与m邻接

    像素之间的邻接性: 4邻接.如果q在集合N4(p)中,则具有V中数值的两个像素p和q是4邻接的. 8邻接.如果q在集合N8(p)中,则具有V中数值的两个像素p和q是8邻接的. m邻接(混合邻接).如果 ...

  5. PHP unset销毁变量并释放内存

    PHP的unset()函数用来清除.销毁变量,不用的变量,我们可以用unset()将它销毁.但是某些时候,用unset()却无法达到销毁变量占用的内存!我们先看一个例子: <?php $s=st ...

  6. file-loader及url-loader的使用

    file-loader主要用来处理图片,其实也可以在js和html及其他文件上,但很少那么使用,比如: require("file-loader?name=js/[hash].script. ...

  7. java构造方法的作用以及简单java类

    public class TestDemo{ public static void main(String args[]){ Emp emp1 =new Emp(001,"tom" ...

  8. Office2013插件开发Outlook篇(1)-- 第一个office2013插件

    一.环境: 下载VS2013安装,记得安装office插件开发包哦. 二.新建Outlook插件项目

  9. jquery-leonaScroll-1.2-自定义滚动条插件

    leonaScroll-1.2.js 下载链接地址:http://share.weiyun.com/bb531dd6b1916c0023c176897182dc15 (密码:iZck)[内含压缩版] ...

  10. Java中getResourceAsStream的用法

    首先,Java中的getResourceAsStream有以下几种: 1. Class.getResourceAsStream(String path) : path 不以'/'开头时默认是从此类所在 ...