理解http304响应
来源:互联网 发布:信息技术网络研修心得 编辑:程序博客网 时间:2024/06/07 21:19
一、什么是304
先看一下304解释:
更详细一点,我们可以这么理解:
1、如果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。
2、对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。
3、对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。因此,对于动态页面做缓存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。虽然在返回 304 的时候已经做了一次数据库查询,但是可以避免接下来更多的数据库查询,并且没有返回页面内容而只是一个 HTTP Header,从而大大的降低带宽的消耗,对于用户的感觉也是提高。
二、Last-Modified
1、在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:
Last-Modified: Fri, 12 May 2006 18:53:33 GMT
2、客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
服务器端的程序先取得这个字段的值,然后与服务器上的数据最后修改时间对比,如果服务器端的资源没有变化,就直接返回 304 Not Modified 状态码,然后停止。这样就节省了传输数据量,达到节省带宽的目的。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。具体见下图:
三、为什么要使用条件请求
当用户访问一个网页时,条件请求可以加速网页的打开时间(因为可以省去传输整个响应体的时间),但仍然会有网络延迟,因为浏览器还是得为每个资源生成一条条件请求,并且等到服务器返回HTTP/304响应,才能读取缓存来显示网页.更理想的情况是,服务器在响应上指定Cache-Control或Expires指令,这样客户端就能知道该资源的可用时间为多长,也就能跳过条件请求的步骤,直接使用缓存中的资源了.
可是,即使服务器提供了这些信息,在下列情况下仍然需要使用条件请求:
在超过服务器指定的过期时间之后 如果用户执行了刷新操作的话
四、CTRL-F5会无条件的请求页面中的每个资源
如果用户按下了CTRL-F5 (有时称之为“强刷-hard refresh”),你会发现浏览器省略了If-Modified-Since和If-None-Match请求头,也就是无条件的请求页面中的每个资源.
整理来自:
http://www.studyofnet.com/news/982.html
http://www.cnblogs.com/ziyunfei/archive/2012/11/16/2772729.htm
- 理解http304响应
- http304的理解
- http304
- 理解HTTP/304响应
- 理解HTTP/304响应
- 理解HTTP/304响应
- 理解响应式布局
- 理解HTTP/304响应
- 响应式编程:理解响应式编程
- 深入理解AJAX响应信息处理
- 理解HTTP响应的ETag
- 系统冲激响应的理解
- Android Menu理解与响应
- 深入理解http响应拆分
- [译]理解HTTP/304响应
- [译]理解HTTP/304响应
- 理解Http请求与响应
- HTTP状态的含义(HTTP100,HTTP304等)
- C++/MFC-对话框
- xmlbeans问题(深刻)
- html、js if判断
- 第十四章 SSL——《跟我学Shiro》
- python中 with...as的用法
- 理解http304响应
- hibernate 与 mybatis
- 文章标题
- mysql [Err] 1292
- 同步定位与地图构建SLAM过程
- Android--RadioGroup和Tablayout两种实现底部导航的方式详解
- PHP环境搭建(7)----fpm配置
- [BZOJ 3757]苹果树:树上莫队
- 《python爬虫伊始(百度首页)》