HTTP 304: Not Modified
标准解释是:Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
我们先来看下浏览器的工作原理:
(1) 直接在缓存中去获取内容。如果先前有效访问的响应头包含 Expires, max-age的话,“打开新窗口”、“输入URI回车”、“前一页”、“后一页”这些浏览器行为不会使浏览器在Expires, max-age设置的有效期时间内去访问服务器,而是在缓存中去获取内容,但是"刷新'"或"重载"例外。
(2)访问服务器,根据服务器响应来 获取内容。这种情况发生在设置no-cache等头标要求不缓存,或者是设置了 Expires,max-age但浏览器行为是“刷新”或“重载”时候。'Last-Modified'、'ETag'、'must- revalidate' 等有些特殊,不直接受浏览器行为影响,它们必须访问服务器后,再由服务器判断是直接发送新的资源,还是发送一个304 Not Modfied让浏览器使用缓存中的资源。
如果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。
因此,对于动态页面做缓存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。虽然在返回 304 的时候已经做了一次数据库查询,但是可以避免接下来更多的数据库查询,并且没有返回页面内容而只是一个 HTTP Header,从而大大的降低带宽的消耗,对于用户的感觉也是提高。
如何测试HTTP状态,缓存是否有效?
可以使用HttpWatch
第一次访问 200
鼠标点击二次访问 (Cache)
按F5刷新 304
按Ctrl+F5强制刷新 200
如果是这样的就说明缓存真正有效了。
对 HTTP 304 的理解
最近和同事一起看Web的Cache问题,又进一步理解了 HTTP 中的 304 又有了一些了解。
304 的标准解释是:Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
如 果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。
因此,对于动态页面做缓存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。虽然在返回 304 的时候已经做了一次数据库查询,但是可以避免接下来更多的数据库查询,并且没有返回页面内容而只是一个 HTTP Header,从而大大的降低带宽的消耗,对于用户的感觉也是提高。
当这些缓存有效的时候,通过 HttpWatch 查看一个请求会得到这样的结果:
第一次访问 200
鼠标点击二次访问 (Cache)
按F5刷新 304
按Ctrl+F5强制刷新 200
如果是这样的就说明缓存真正有效了。以上就是我对 HTTP 304 的一个理解。
- 浏览: 387684 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Nabulio:
写的详细,特殊语法学习到了
jdk1.5-1.9新特性 -
wooddawn:
您好,最近在做个足球数据库系统,用到了betbrain的数据表 ...
javascript深入理解js闭包 -
lwpan:
很受启发 update也可以
mysql 的delete from 子查询限制 -
wuliaolll:
不错,总算找到原因了
mysql 的delete from 子查询限制
发表评论
-
不同的声音-我为什么反对用Node
2015-09-10 10:41 649随着无线端的快速普及 ... -
模块化开发之sea.js实现原理总结
2014-11-27 10:38 973seajs官网说:seajs是一个 ... -
javascript中=,==,===号的区别
2014-11-24 09:10 502= 赋值运算符 == 等于 === 严格等于 ... -
javaScript代码如何理解
2014-11-19 08:55 590如下的JavaScript代码如何 ... -
javascript深入理解js闭包
2014-11-13 14:01 1002一、变量的作用域 要 ... -
SHTML 教程
2014-11-11 14:35 865什么是 SHTML 使用SSI(Se ... -
minify使用手冊
2014-09-10 10:58 631版权声明:转载时请以 ... -
Varnish
2014-06-19 11:34 8471简介 Varnish是一款高性能的开源HTTP加速 ... -
iframe跨域访问
2014-05-06 11:33 794js跨域是个讨论很多的 ... -
Nginx配置文件详细说明
2014-04-18 08:34 421在此记录下Nginx服务器ng ... -
HTML中td 中折行成2行的办法
2014-04-01 16:39 906element.style { border-bott ... -
HTML中HR属性
2014-03-31 10:54 9951、size线段粗细的设定: <HR&g ... -
一段jquery代码的性能问题
2014-02-11 19:02 645用jquery class去获取对象的属性,在firefox ... -
js获取几天后的日期,获取当前月最后一天
2013-12-10 16:56 2525function date2str(n) { var ... -
js求星期几
2013-10-11 17:31 514var weekArray = new Array(&quo ... -
跨站脚本攻击
2013-10-08 14:35 946跨站脚本是近年来最 ... -
js比较字符串大小
2013-09-26 18:10 913与操作字符串有关的最后一个方法是localeCompare ... -
js对特定表格排序
2013-09-26 17:43 736function initSortArrays() { ... -
使用Minify来优化网站性能
2013-09-16 15:25 815Minify 是用PHP5开发的应用,通过遵循一些Yahoo ... -
JavaScript的性能优化:加载和执行
2013-09-09 14:06 686随着Web2.0技术的不断推广,越来越多的应用使用 Jav ...
相关推荐
#### 三、常见状态码实例分析 1. **204 No Content**:此状态码通常用于表示服务器成功处理了请求,但没有返回任何数据。例如,客户端可以通过发送一个HTTP请求检查某个资源是否存在,而不需要实际获取该资源的内容...
在实际开发中,通过分析HTTP响应状态码,我们可以快速定位问题所在。例如,如果看到404状态码,我们就知道是资源不存在,而500状态码则可能提示我们服务器端存在问题。此外,开发者工具通常会提供查看HTTP状态码的...
通过分析`http状态码.txt`文件,我们可以详细了解各种HTTP状态码的具体含义和应用场景,这对于调试和优化网络应用非常有帮助。在实际开发中,我们需要根据返回的状态码调整请求策略,确保数据的正确传输和应用的正常...
### HTTP状态码详细总结 HTTP状态码是在HTTP通信过程中,由服务器向客户端返回的一个三位数字的响应状态码,用于指示客户端...了解这些状态码可以帮助开发人员更好地调试程序,同时也有助于网络工程师分析和解决问题。
- **304 Not Modified**:客户端发送了一个带有条件的GET请求,服务器端检查后发现请求的资源并没有更新,因此返回该状态码,表示客户端可以继续使用其缓存的副本。 #### 4xx:请求包含一个错误语法或不能完成 这...
通过分析服务器日志中出现的不同状态码,开发者可以发现并解决可能出现的问题,确保网站的正常运行和用户友好体验。同时,正确设置重定向状态码(如301和302)对保持网站结构的稳定性和搜索引擎排名至关重要。
而“工具”可能涉及使用各种开发工具,如浏览器开发者工具、HTTP客户端库或服务器日志分析工具来查看和分析HTTP状态码。 提供的文档列表似乎与HTTP状态码主题关联度不高,它们的名称如"EMMAMPTM_GuideLineForR3&R2_...
了解HTTP状态代码可以帮助我们更好地分析日志中的访问情况。 1xx 信息响应 * 100:表示已收到请求的一部分,正在继续发送余下部分。 * 101:切换协议。 2xx 成功 * 200:确定。客户端请求已成功。 * 201:已创建...
最常见的是301和304状态码。 - 301(永久移动):请求的资源已永久移动到新的URL。响应头中会包含新的URL(Location字段),浏览器通常会自动跳转到新URL。 - 304(未修改):客户端缓存的文件未被修改,服务器告诉...
开发者可以通过监控和分析这些状态码来诊断和修复问题,而安全专家则利用它们来发现潜在的安全漏洞和攻击行为。在Web应用安全中,理解HTTP状态码可以帮助我们更好地理解和应对各种网络交互情况。
了解这些状态码对于分析和解决网络问题至关重要。 #### HTTP状态码的意义 HTTP状态码是一组由三位数字组成的代码,用来表示服务器对客户端请求的响应结果。这些状态码分为五大类,每种状态码都有特定的含义和用途...
例如,HTTP状态码“304”表示资源未被修改,客户端可以使用缓存的版本。 手册中还提到了对于处理日志的命令需要根据实际的日志格式进行适当的调整。比如,如果日志格式被自定义过,可能需要使用-F选项来定义字段...
了解http状态代码可以更详细地分析日志中的访问情况。下面是常见的http协议状态码及其含义: 1. 1xx:信息响应 * 100:表示已收到请求的一部分,正在继续发送余下部分。 * 101:切换协议。 2. 2xx:成功 * 200:...
3. **利用304状态码**:通过设置适当的缓存策略,可以减少服务器负载,提高用户体验。 4. **监控服务器状态**:定期检查服务器日志,确保没有出现5xx错误,这表明服务器存在问题。 5. **改善服务器响应时间**:优化...
在LoadRunner测试中,识别并分析这些HTTP状态代码有助于找出系统的问题,如网络连接问题、服务器错误、客户端错误等,从而优化软件性能和用户体验。了解这些代码的含义,对于开发者调试问题、测试工程师定位性能瓶颈...
若资源未修改,服务器会返回304状态码,告知浏览器使用本地缓存;若已修改,则返回200状态码及新的资源内容。 4. **实验数据分析**: 实验结果显示,服务器gaia.cs.umass.edu的IP地址是128.119.245.12,而实验...
- **状态码**:304(表示资源未修改) - **返回字节数**:0 - **Referer**:http://blog.fens.me/nodejs-socketio-chat/(来源页面) - **User-Agent**:Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101...
了解这些状态码对于分析网站性能、调试问题以及优化用户体验至关重要。例如,如果频繁看到404状态码,可能意味着存在死链;而500状态码则表明服务器端存在问题,需要排查服务器配置或应用程序错误。通过对IIS日志的...
4. **304(Not Modified)**:当客户端发送带条件的GET请求(比如使用If-Modified-Since或If-None-Match头),并且服务器发现资源自上次客户端获取以来没有改变,服务器将返回304状态码,告知客户端使用缓存中的版本...