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资源的请求中,浏览器只进行两种动作:
- 直接在缓存中去获取内容。如果先前有效访问的响应头包含 Expires, max-age的话,“打开新窗口”、“输 入URI回车”、“前一页”、“后一页”这些浏览器行为不会使浏览器在Expires, max-age设置的有效期时间内去访问服务器,而是在缓存中去获取内容,但是'"刷新'"或"重载"例外。
- 访问服务器,根据服务器响应来获取内容。这种情况发生在设置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状态码,这意味着客户端(浏览器)在向服务器请求资源时,服务器发现该资源自上次请求后并未发生变化,因此没有发送实际内容,而是告知客户端可以...
总的来说,理解并正确使用 `Caching HTTP Headers, Last-Modified 和 ETag` 是提高Web应用性能的关键,它们是HTTP协议中的重要工具,能够显著减少网络延迟,提升用户对网页加载速度的感知。同时,熟练掌握这些概念也...
304 Not Modified是一种HTTP状态码,表示客户端(浏览器)已经缓存了资源,并且该资源未发生变化,服务器无需发送完整内容。为了有效利用304缓存,我们需要设置合适的HTTP响应头。在HttpModule中,我们可以在`...
假设Ecshop中有一个名为`$.fn`的方法用于实现某个特定功能,而在引入jQuery后,该方法被覆盖或者发生了作用域冲突,从而使得原本正常运行的功能无法正常使用。 ### 四、解决Ecshop与jQuery冲突的方法 为了有效地...
HTTP状态码304(Not Modified)就是协商缓存的结果。当服务器确认资源未被修改时,返回304响应,浏览器便继续使用本地缓存的资源。这节省了网络带宽,提高了页面加载速度。 更新静态资源的常见策略有: 1. **...
304 未修改(Not Modified) 305 使用代理 ④ 客户方错误 400 错误请求(Bad Request) 401 未认证 402 需要付费 403 禁止(Forbidden) 404 未找到(Not Found) 405 方法不允许 ...
客户端发送请求至缓存服务器,缓存服务器发送条件GET请求,服务器响应304 Not Modified或最新的请求资源。 计算机网络基础知识及Http协议是计算机网络的核心内容,对于深入理解计算机网络和开发网络应用程序非常...
- 如果对象未被修改,服务器将返回`304 Not Modified`,客户端使用缓存中的副本。 - 如果对象被修改,服务器返回完整的实体和一个`200 OK`状态码。 #### 三、检索长文档 1. **长文档的处理**: - 在请求长文档...
* 304 Not Modified:服务器已经成功处理了客户端的请求,但自从上次客户端请求后,网页没有修改。 * 305 Use Proxy:客户端只能使用代理来访问服务器的网页。 4xx 客户端错误 这些状态码表示客户端可能出错,阻碍...
在ASP.NET Web API中,HTTP 304状态码是用于实现HTTP缓存机制的一部分,特别是“Not Modified”(未修改)响应。这个状态码允许客户端(如浏览器)利用缓存副本,减少不必要的网络传输,提高性能。本文将深入探讨...
当`If-Modified-Since`的日期与服务器资源的`Last-Modified`相同,服务器可以返回304 Not Modified状态,避免传输整个文件。 7. **性能优化** 使用`Last-Modified`和`ETag`可以显著提升用户体验,减少不必要的网络...
该错误通常发生在客户端尝试使用GET方法访问一个只支持其他HTTP方法(如POST)的Servlet时。为了解决这个问题,你需要确保Servlet正确地覆盖了对应HTTP方法的处理方法,比如`doGet()`。如果Servlet只处理POST请求,...
状态码 一个命令行应用程序,可快速查找http状态代码的含义。安装 $ npm install -g status-code用法 $ statuscode [options] 参考执照麻省理工学院
HTTP状态码304代表“Not Modified”(未修改),表示服务器允许浏览器使用本地缓存的文件。当浏览器再次向服务器请求某个已缓存的资源时,如果该资源未被修改,服务器通过发送304状态码来告诉浏览器可以直接使用缓存...
服务器根据这些信息判断资源是否改变,如果没有变化,会返回304 Not Modified状态码,浏览器则更新资源的本地副本,避免了数据的重复传输。 现在,我们详细解释一下这两个缓存类型: 1. 强缓存:主要通过Cache-...
如果资源未改变,服务器仅返回304 Not Modified响应,这样可以避免传输完整的响应体,减少网络延迟。 其次,减少HTTP请求次数也是优化的关键。这可以通过以下三种方式实现: 1. **减少重定向请求次数**:重定向...
`yum`是Yellowdog Updater, Modified的缩写,是一个在Fedora、RHEL以及CentOS等基于RPM包管理的Linux发行版中广泛使用的软件包管理器。但在RockLinux9中,这个命令可能并未预装或者路径设置不正确。 首先,我们需要...
如果服务器端返回状态码304(Not modified),那么jQuery将重新使用缓存中的条目,这样可以节约很多流量。 cache选项基本上是覆盖服务器端返回的HTTP头信息中的所有关于缓存的设置。如果设置cache选项为false,...
如果资源未改变,服务器将返回304 Not Modified状态码,而不是完整的资源内容,这样就避免了重复下载,节省了带宽和时间。 lws库是一个轻量级的web服务器,通常被用作嵌入式环境或开发人员自定义HTTP服务的组件。它...
4. **304(Not Modified)**:当客户端发送带条件的GET请求(比如使用If-Modified-Since或If-None-Match头),并且服务器发现资源自上次客户端获取以来没有改变,服务器将返回304状态码,告知客户端使用缓存中的版本...