`
bingodin
  • 浏览: 15198 次
  • 性别: 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了,多好啊

 

分享到:
评论

相关推荐

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

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

    vapr-conditionals:一个Vapr插件,用于处理条件请求

    vapr 条件句 安装 npm install --save vapr npm install --save vapr-conditionals 用法 此插件启用。 具体来说,它处理 If-Match、If-None-Match、If-Modified-... req.validate()函数可以引发304 Not Modified或41

    HTTP协议详解

    10.3.5 304 没有被改变(Not Modified) 10.3.6 305 使用代理服务器 (User Proxy) 10.3.7 306没有使用的(unused) 10.3.8 307临时重发(Temporary Redirect) 10.4 客户错误 4xx 10.4.1 400 坏请求(Bad Request) ...

    Http1.1超文本传输协议中文版

    10.3.5 304 没有被改变(Not Modified) 62 10.3.6 305 使用代理服务器 (User Proxy) 63 10.3.7 306没有使用的(unused) 63 10.3.8 307临时重发(Temporary Redirect) 63 10.4 客户错误 4xx 63 10.4.1 400 坏请求...

    2009 达内Unix学习笔记

    命令和参数之间必需用空格隔开,参数和参数之间也必需用空格隔开。 一行不能超过256个字符;大小写有区分。 二、特殊字符含义 文件名以“.”开头的都是隐藏文件/目录,只需在文件/目录名前加“.”就可隐藏它。...

    HTTP服务器状态码定义.doc

    304 Not Modified 如果客户端成功执行了条件GET请求,而对应文件自If-Modified- Since域所指定的日期以来就没有更新过,服务器应当回应此状态码,而不是将实体主体 发送给客户端。回应标题域中只应包括一些相关信息...

    modified-std-module:使用此库,您需要较少的代码来编写用于修改商店的系统和类扩展

    使用此库,您需要较少的代码来编写用于修改的系统和类扩展。 如果您需要帮助,请访问 for MMLC。 要求 PHP 7.0或以上 (推荐) 作者 2020年,罗宾·维申多夫(Robin Wieschendorf) 用法 类别:StdModule 这是一...

    ImpREC 1.7c

    - New imports scheme added (NOT COMPLETE SO DO NOT USE IT) - Support relative calls rebuild =&gt; visible with a (R) tag in imports - Fixed a bug with "Create New IAT". It can now manage a thunk ...

    vue在index.html中引入静态文件不生效问题及解决方法

    本文针对的是Vue小白,不喜勿喷,谢谢 出现该问题的标志如下 ... 出现的原因及解决办法 第一种可能出现原因就是引入的静态文件在src文件夹内,这种的解决办法就是把资源引入静态资源的目录static ...

    Git指令的Shell脚本

    使用方法: 1. 在Linux系统中,将本文件放在Git库目录下,利用Shell运行本文件; 2.在windows系统中,需下载安装与操作系统相对应的Git软件,并将本文件放在Git库目录下,双击即可运行。 运行示例: Please choose...

    SlickEdit17(2012)

    原下载链接:http://bbs.pediy.com/showthread.php?t=152260 大家可以到这里下,也可以去原作者哪里下。 原文: http://www.slickedit.com/ ...then you were not born to be a scientific thinker.

    Pretty-console.log:一个极简主义的模块,用于更改console.log的行为并使之更漂亮

    漂亮的console.log 一个极简主义的模块,用于更改console.log的行为并使之更漂亮。..." ) // The behavior of console.log will not be modified but the argument will be pretty printed作者埃默拉德

    java-servlet-api.doc

    这份文档以及刚才提及的Javadoc格式的文档都描述了这两个软件包,Javadoc格式的文档还描述了你应该如何使用这两个软件包中的所有方法。 有关规范 你也许对下面的这些Internet规范感兴趣,这些规范将直接影响到...

    smart-copier:Java库,用于复制和同步文件夹

    // Copy new files, remove deleted files, copy modified filed but do not touch the other files ISmartVisitor visitor = new OneWaySyncVisitor (); // Compare files with SHA-256 IUpdatePolicy policy = new...

    C++MFC教程

    |------ 4.F 关于WM_NOTIFY的使用方法 +-- 第五章 对话框 |------ 5.1 使用资源编辑器编辑对话框 |------ 5.2 创建有模式对话框 |------ 5.3 创建无模式对话框 |------ 5.4 在对话框中进行消息映射 |------ 5.5 在...

    binch:python urwid中的轻型ELF二进制补丁工具

    用法$ ./binch [binary name]捷径g: Go to a specific address. (if not exists, jump to nearest address)d: Remove a current line. (Fill with nop)q: Quit.s: Save a modified binary to a file.enter: Modify a...

    基于Springboot SSM框架+Mysql的电子商务商城项目源码+项目说明(本科课程设计).zip

    3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 # 商城...

    goleveldb:Go中的LevelDB键值数据库

    这是的实现。... // Remember that the contents of the returned slice should not be modified. data , err := db . Get ([] byte ( "key" ), nil ) ... err = db . Put ([] byte ( "key" ), [] byte

    大名鼎鼎SWFUpload- Flash+JS 上传

     在SWFUpload的使用过程中,无论在客户端还是服务器端都要和File Object打交道,在一个File Object中包含了以下内容:  {  id : string, // SWFUpload file id, used for starting or cancelling and upload  ...

    svm matlab版本

    have modified the sources and would like to re-build the package, type 'mex -setup' in MATLAB to choose a compiler for mex first. Then type 'make' to start the installation. Starting from MATLAB 7.1 ...

Global site tag (gtag.js) - Google Analytics