MyException - 我的异常网
当前位置:我的异常网» 综合 » 懂得HTTP/304响应

懂得HTTP/304响应

www.MyException.Cn  网友分享于:2015-08-26  浏览:0次
理解HTTP/304响应

原文地址:
http://www.telerik.com/automated-testing-tools/blog/eric-lawrence/12-11-06/understanding-http-304-responses.aspx
刚刚开始使用Fiddler的用户经常会对Fiddler的网络会话(Web Sessions)列表中的HTTP/304响应感到困惑:
这里写图片描述
如果客户端发送的是一个条件验证(Conditional Validation)请求,则web服务器可能会返回HTTP/304响应,这就表明了客户端中所请求资源的缓存仍然是有效的,也就是说该资源从上次缓存到现在并没有被修改过.条件请求可以在确保客户端的资源是最新的同时避免因每次都请求完整资源给服务器带来的性能问题.

辨别条件请求

当客户端缓存了目标资源但不确定该缓存资源是否是最新版本的时候,就会发送一个条件请求.在Fiddler中,你可以在Headers Inspector查找相关请求头,这样就可以辨别出一个请求是否是条件请求.

在进行条件请求时,客户端会提供给服务器一个If-Modified-Since请求头,其值为服务器上次返回的Last-Modified响应头中的日期值,还会提供一个If-None-Match请求头,值为服务器上次返回的ETag响应头的值:

这里写图片描述

服务器会读取到这两个请求头中的值,判断出客户端缓存的资源是否是最新的,如果是的话,服务器就会返回HTTP/304 Not Modified响应,但没有响应体.客户端收到304响应后,就会从缓存中读取对应的资源.

另一种情况是,如果服务器认为客户端缓存的资源已经过期了,那么服务器就会返回HTTP/200 OK响应,响应体就是该资源当前最新的内容.客户端收到200响应后,就会用新的响应体覆盖掉旧的缓存资源.

只有在客户端缓存了对应资源且该资源的响应头中包含了Last-Modified或ETag的情况下,才可能发送条件请求.如果这两个头都不存在,则必须无条件(unconditionally)请求该资源,服务器也就必须返回完整的资源数据.

为什么要使用条件请求

当用户访问一个网页时,条件请求可以加速网页的打开时间(因为可以省去传输整个响应体的时间),但仍然会有网络延迟,因为浏览器还是得为每个资源生成一条条件请求,并且等到服务器返回HTTP/304响应,才能读取缓存来显示网页.更理想的情况是,服务器在响应上指定Cache-Control或Expires指令,这样客户端就能知道该资源的可用时间为多长,也就能跳过条件请求的步骤,直接使用缓存中的资源了.可是,即使服务器提供了这些信息,在下列情况下仍然需要使用条件请求:

  • 在超过服务器指定的过期时间之后
  • 如果用户执行了刷新操作的话
  • 在上节给出的图片中,请求头中包含了一个Pragma: no-cache.这是由于用户使用F5刷新了网页.如果用户按下了CTRL-F5 (有时称之为“强刷-hard refresh”),你会发现浏览器省略了If-Modified-Since和If-None-Match请求头,也就是无条件的请求页面中的每个资源.

    避免条件请求

    通常来说,缓存是个好东西.如果你想提高自己网站的访问速度,缓存是必须要考虑的.可是在调试的时候,有时候需要阻止缓存,这样才能确保你所访问到的资源是最新的.

    你也许会有个疑问:“如果不改变网站内容,我怎么才能让Fiddler不返回304而返回一个包含响应体的HTTP/200响应呢?”

    你可以在Fiddler中的网络会话(Web Sessions)列表中选择一条响应为HTTP/304的会话,然后按下U键.Fiddler将会无条件重发(Unconditionally reissue)这个请求.然后使用命compare命令对比一下两个请求有什么不同,对比结果如下,从中可以得知,Fiddler是通过省略条件请求头来实现无缓存请求的:

    这里写图片描述

    如果你想全局阻止HTTP/304响应,可以这么做:首先清除浏览器的缓存,可以使用Fiddler工具栏上的Clear Cache按钮(仅能清除Internet Explorer缓存),或者在浏览器上按CTRL+SHIFT+DELETE(所有浏览器都支持).在清除浏览器的缓存之后,回到Fiddler中,在菜单中选择Rules > Performance > Disable Caching选项,然后Fiddler就会:删除所有请求中的条件请求相同的请求头以及所有响应中的缓存时间相关的响应头.此外,还会在每个请求中添加Pragma: no-cache请求头,在每个响应中添加Cache-Control: no-cache响应头,阻止浏览器缓存这些资源.

    文章评论

    老程序员的下场
    老程序员的下场
    “懒”出效率是程序员的美德
    “懒”出效率是程序员的美德
    如何成为一名黑客
    如何成为一名黑客
    程序员眼里IE浏览器是什么样的
    程序员眼里IE浏览器是什么样的
    程序员都该阅读的书
    程序员都该阅读的书
    那些性感的让人尖叫的程序员
    那些性感的让人尖叫的程序员
    为什么程序员都是夜猫子
    为什么程序员都是夜猫子
    程序员应该关注的一些事儿
    程序员应该关注的一些事儿
    初级 vs 高级伟德国际app者 哪个性价比更高?
    初级 vs 高级伟德国际app者 哪个性价比更高?
     程序员的样子
    程序员的样子
    2013年美国伟德国际app者薪资调查报告
    2013年美国伟德国际app者薪资调查报告
    要嫁就嫁程序猿—钱多话少死的早
    要嫁就嫁程序猿—钱多话少死的早
    总结2014中国互联网十大段子
    总结2014中国互联网十大段子
    写给自己也写给你 自己到底该何去何从
    写给自己也写给你 自己到底该何去何从
    一个程序员的时间管理
    一个程序员的时间管理
    程序员周末都喜欢做什么?
    程序员周末都喜欢做什么?
    亲爱的项目经理,我恨你
    亲爱的项目经理,我恨你
    程序员和编码员之间的区别
    程序员和编码员之间的区别
    编程语言是女人
    编程语言是女人
    程序猿的崛起——Growth Hacker
    程序猿的崛起——Growth Hacker
    当下全球最炙手可热的八位少年创业者
    当下全球最炙手可热的八位少年创业者
    程序员的一天:一寸光阴一寸金
    程序员的一天:一寸光阴一寸金
    聊聊HTTPS和SSL/TLS协议
    聊聊HTTPS和SSL/TLS协议
    那些争议最大的编程观点
    那些争议最大的编程观点
    Java程序员必看电影
    Java程序员必看电影
    旅行,写作,编程
    旅行,写作,编程
    5款最佳正则表达式编辑调试器
    5款最佳正则表达式编辑调试器
    Web伟德国际app者需具备的8个好习惯
    Web伟德国际app者需具备的8个好习惯
    Google伦敦新总部 犹如星级庄园
    Google伦敦新总部 犹如星级庄园
    我的丈夫是个程序员
    我的丈夫是个程序员
    老美怎么看待阿里赴美上市
    老美怎么看待阿里赴美上市
    10个调试和排错的小建议
    10个调试和排错的小建议
    什么才是优秀的用户界面设计
    什么才是优秀的用户界面设计
    程序员最害怕的5件事 你中招了吗?
    程序员最害怕的5件事 你中招了吗?
    十大编程算法助程序员走上高手之路
    十大编程算法助程序员走上高手之路
    中美印日四国程序员比较
    中美印日四国程序员比较
    为啥Android手机总会越用越慢?
    为啥Android手机总会越用越慢?
    做程序猿的老婆应该注意的一些事情
    做程序猿的老婆应该注意的一些事情
    2013年中国软件伟德国际app者薪资调查报告
    2013年中国软件伟德国际app者薪资调查报告
    不懂技术不要对懂技术的人说这很容易实现
    不懂技术不要对懂技术的人说这很容易实现
    科技史上最臭名昭著的13大罪犯
    科技史上最臭名昭著的13大罪犯
    程序员的鄙视链
    程序员的鄙视链
    我是如何打败拖延症的
    我是如何打败拖延症的
    60个伟德国际app者不容错过的免费资源库
    60个伟德国际app者不容错过的免费资源库
    如何区分一个程序员是“老手“还是“新手“?
    如何区分一个程序员是“老手“还是“新手“?
    漫画:程序员的工作
    漫画:程序员的工作
    Web伟德国际app人员为什么越来越懒了?
    Web伟德国际app人员为什么越来越懒了?
    Java 与 .NET 的平台发展之争
    Java 与 .NET 的平台发展之争
    “肮脏的”IT工作排行榜
    “肮脏的”IT工作排行榜
    软件伟德国际app程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有