`
bingodin
  • 浏览: 15697 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

HTTP 304 Not Modified作用和用法

阅读更多

HTTP 304客户端缓存优化的神奇作用和用法

 

 

[转自]:http://spyrise.org/blog/tb.php?t=464&extra=a1d38

 

HTTP 304: Not Modified,与服务器的缓存设置非常有关。

Last-Modified这个头标是一个响应头标,表示客户端(通常指浏览器)所请求资源在服务器端的最后修改时间。通常情况下客户端在接受这个头标后,在以后对这个资源的请求会附带一个'If-Modified-Since'请求头标,而这个头标是想告诉服务器上次客户端所请求资源的最后修改时间。

 

对于一些图像、css、js等静态文件资源,配置好了的apache服务器会理解这些If-Modified-Since请求头标,将头标里的时间和文件的最后修改时间进行比较并作出响应。如果二者相等则发送一个"304 Not Modified"来告诉客户端所请求资源并未修改,让客户端放心使用缓存中的资源,否则的话会重新发送一个新的资源和新的Last-Modified的头标。

 

浏览器的一些工作原理:

 在先前至少有过一次有效访问后,在以后对同一URI资源的请求中,浏览器只进行两种动作:

  1. 直接在缓存中去获取内容。如果先前有效访问的响应头包含 Expires, max-age的话,“打开新窗口”、“输 入URI回车”、“前一页”、“后一页”这些浏览器行为不会使浏览器在Expires, max-age设置的有效期时间内去访问服务器,而是在缓存中去获取内容,但是'"刷新'"或"重载"例外。
  2. 访问服务器,根据服务器响应来获取内容。这种情况发生在设置no-cache等头标要求不缓存,或者是设置了 Expires,max-age但浏览器行为是“刷新”“重载”时候。'Last-Modified'、'ETag'、'must-revalidate' 等有些特殊,不直接受浏览器行为影响,它们必须访问服务器后,再由服务器判断是直接发送新的资源,还是发送一个304 Not Modfied让浏览器使用缓存中的资源。

 

目的

尽可能减少服务器向客户端重复发送资源,尤其是图片,Flash,CSS,JS等。

原理

1、强行判断$_ENV['If-Modified-Since']是否等于$file_mtime,如果相等,是发送HTTP 304 Not Modified,告诉浏览器,你直接用你缓存中的好了。当然了,如果两者不相等,或缓存中的文件被删除了,就直接发送新的内容。

2、$_ENV['If-Modified-Since']变量存在的前提是,在前一次有效的访问过程中,发送了形如Last-Modified: Sat, 07 Mar 2009 13:28:57 GMT的Header。

方法:

1、先配置.htaccess,强行将扩展名为.jpg|.png|.gif|.css|.js|.swf的文件,转交给gzip.php处理。参考《Bo-blog的一种更简单更实用的gzip优化方法》。

2、检查要访问的URI是否是一个文件,用is_file($file)判断,如果不是,Header至404 Error。

3、检查gzip.php得到的访问URI是否满足.jpg|.png|.gif|.css|.js|.swf的要求,如果不符合,Header至403 Forbidden。
4、检查$_ENV['If-Modified-Since']是否等于$file_mtime,如果相等,发送304 Not Modified。
5、如果第4步的结果是不相等的,判断是否是.css|.js,如果是,使用gzip发送。否则如果是.jpg|.png|.gif|.swf,不使用gzip发送

 

这样做的结果与好处:

除非服务器端文件更新(导致Last-Modified值变化),或是客户端缓存被清除,否则不管你是刷新还是重载,我都会发送304 Not Modified,指示你直接用你那边的缓存就可以了,不必到我这里来取。<-这对一些大的文件资源,如图像,JS,CSS等,非常有用!!!本来要发送一个100k的图像的,我现在只要发送500个字节左右的数据,告诉你直接用缓存就OK了,多好啊

 

分享到:
评论

相关推荐

    ajax加载页面服务器返回 304 not modified

    在使用Ajax技术进行网页部分更新时,如果服务器返回304 Not Modified状态码,这意味着客户端(浏览器)在向服务器请求资源时,服务器发现该资源自上次请求后并未发生变化,因此没有发送实际内容,而是告知客户端可以...

    Caching HTTP Headers, Last-Modified and ETag

    总的来说,理解并正确使用 `Caching HTTP Headers, Last-Modified 和 ETag` 是提高Web应用性能的关键,它们是HTTP协议中的重要工具,能够显著减少网络延迟,提升用户对网页加载速度的感知。同时,熟练掌握这些概念也...

    C# MVC HttpModule 防盗链和图片304缓存

    304 Not Modified是一种HTTP状态码,表示客户端(浏览器)已经缓存了资源,并且该资源未发生变化,服务器无需发送完整内容。为了有效利用304缓存,我们需要设置合适的HTTP响应头。在HttpModule中,我们可以在`...

    ecshop和jquery冲突的解决方法

    假设Ecshop中有一个名为`$.fn`的方法用于实现某个特定功能,而在引入jQuery后,该方法被覆盖或者发生了作用域冲突,从而使得原本正常运行的功能无法正常使用。 ### 四、解决Ecshop与jQuery冲突的方法 为了有效地...

    web服务器缓存静态资源,更新静态资源的规则,静态资源如css,js文件 HTTP CODE 304.zip

    HTTP状态码304(Not Modified)就是协商缓存的结果。当服务器确认资源未被修改时,返回304响应,浏览器便继续使用本地缓存的资源。这节省了网络带宽,提高了页面加载速度。 更新静态资源的常见策略有: 1. **...

    HTTP状态码.txt

     304 未修改(Not Modified)  305 使用代理 ④ 客户方错误  400 错误请求(Bad Request)  401 未认证  402 需要付费  403 禁止(Forbidden)  404 未找到(Not Found)  405 方法不允许  ...

    计算机网络-基础知识及Http协议

    客户端发送请求至缓存服务器,缓存服务器发送条件GET请求,服务器响应304 Not Modified或最新的请求资源。 计算机网络基础知识及Http协议是计算机网络的核心内容,对于深入理解计算机网络和开发网络应用程序非常...

    计算机网络 Ethereal Lab HTTP答案

    - 如果对象未被修改,服务器将返回`304 Not Modified`,客户端使用缓存中的副本。 - 如果对象被修改,服务器返回完整的实体和一个`200 OK`状态码。 #### 三、检索长文档 1. **长文档的处理**: - 在请求长文档...

    http协议的状态码200、301、304、404、502一览.docx

    * 304 Not Modified:服务器已经成功处理了客户端的请求,但自从上次客户端请求后,网页没有修改。 * 305 Use Proxy:客户端只能使用代理来访问服务器的网页。 4xx 客户端错误 这些状态码表示客户端可能出错,阻碍...

    ASP.NET Web API中未修改的HTTP 304

    在ASP.NET Web API中,HTTP 304状态码是用于实现HTTP缓存机制的一部分,特别是“Not Modified”(未修改)响应。这个状态码允许客户端(如浏览器)利用缓存副本,减少不必要的网络传输,提高性能。本文将深入探讨...

    记录并显示网页的最后修改时间

    当`If-Modified-Since`的日期与服务器资源的`Last-Modified`相同,服务器可以返回304 Not Modified状态,避免传输整个文件。 7. **性能优化** 使用`Last-Modified`和`ETag`可以显著提升用户体验,减少不必要的网络...

    Http-servlet请求源码

    该错误通常发生在客户端尝试使用GET方法访问一个只支持其他HTTP方法(如POST)的Servlet时。为了解决这个问题,你需要确保Servlet正确地覆盖了对应HTTP方法的处理方法,比如`doGet()`。如果Servlet只处理POST请求,...

    statuscode:快速找到http状态代码的含义

    状态码 一个命令行应用程序,可快速查找http状态代码的含义。安装 $ npm install -g status-code用法 $ statuscode [options] 参考执照麻省理工学院

    php静态文件返回304技巧分享

    HTTP状态码304代表“Not Modified”(未修改),表示服务器允许浏览器使用本地缓存的文件。当浏览器再次向服务器请求某个已缓存的资源时,如果该资源未被修改,服务器通过发送304状态码来告诉浏览器可以直接使用缓存...

    浏览器缓存机制 mindMaster脑图与visio流程图

    服务器根据这些信息判断资源是否改变,如果没有变化,会返回304 Not Modified状态码,浏览器则更新资源的本地副本,避免了数据的重复传输。 现在,我们详细解释一下这两个缓存类型: 1. 强缓存:主要通过Cache-...

    p43 - p55 HTTP优化解析

    如果资源未改变,服务器仅返回304 Not Modified响应,这样可以避免传输完整的响应体,减少网络延迟。 其次,减少HTTP请求次数也是优化的关键。这可以通过以下三种方式实现: 1. **减少重定向请求次数**:重定向...

    RockLinux9 bash yum command not found

    `yum`是Yellowdog Updater, Modified的缩写,是一个在Fedora、RHEL以及CentOS等基于RPM包管理的Linux发行版中广泛使用的软件包管理器。但在RockLinux9中,这个命令可能并未预装或者路径设置不正确。 首先,我们需要...

    【ASP.NET编程知识】ASP.NET MVC中使用jQuery时的浏览器缓存问题详解.docx

    如果服务器端返回状态码304(Not modified),那么jQuery将重新使用缓存中的条目,这样可以节约很多流量。 cache选项基本上是覆盖服务器端返回的HTTP头信息中的所有关于缓存的设置。如果设置cache选项为false,...

    前端开源库-lws-conditional-get.zip

    如果资源未改变,服务器将返回304 Not Modified状态码,而不是完整的资源内容,这样就避免了重复下载,节省了带宽和时间。 lws库是一个轻量级的web服务器,通常被用作嵌入式环境或开发人员自定义HTTP服务的组件。它...

    dome2_HTTP协议_

    4. **304(Not Modified)**:当客户端发送带条件的GET请求(比如使用If-Modified-Since或If-None-Match头),并且服务器发现资源自上次客户端获取以来没有改变,服务器将返回304状态码,告知客户端使用缓存中的版本...

Global site tag (gtag.js) - Google Analytics