关于Etag/If-None-Match的用法

转载 2012年03月31日 09:05:46

关于Last-Modified/If-Modified-Since及Etag/If-None-Match的用法

相关代码
if (method_exists($controller, $action)) {
         ob_start();
            $controller -> {$action}();
            $content = ob_get_contents();
            ob_end_clean();
                       
            $etag = md5($content); //计算输出内容的md5
            fheader('Etag: ' . $etag); //服务器端输出Etag header
   //判断浏览器发送过来的If-None-Match头与服务器端的etag值是否相等
            if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag) {
             write_log(sprintf("%s Client HTTP_IF_NONE_MATCH:|%s| and Server Etag:|%s| is same, send 304 header!", __METHOD__, $_SERVER['HTTP_IF_NONE_MATCH'], $etag));
             fheader('HTTP/1.1 304 Not Modified!'); //相等,直接向浏览器发送304状态码,浏览器则直接取本地的缓存数据,节省带宽,提高页面响应速度
            } else {
             write_log(sprintf("%s file content already modified, output content!", __METHOD__));
             echo $content;
            }
        } else {
            $error = get_class($controller) . "::$action not exists!";
            die($error);
            write_log($error);
        }

 

注意服务器端(php)接收浏览器发送过来的If-Modified-Since及If-None-Match时服务器端存在变量
$_SERVER['HTTP_IF_MODIFIED_SINCE']及$_SERVER['HTTP_IF_NONE_MATCH']

---------------------------------------------------------
http://hi.baidu.com/kakaying1985/blog/item/286a13ca90774882c817685d.html
Last-Modified和Etags如何帮助提高性能?
         聪明的开发者会把Last-Modified 和ETags请求的http报头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生 Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。
         过程如下:
                 1. 客户端请求一个页面(A)。
                 2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。
                 3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。
                 4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。
                 5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。
---------------------------------------------------------

-------------------------------------------
下面是用firebug监控到的

Request Headers
Host localhost
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16
Accept text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language zh-cn,zh;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
Cookie 61m_auth=97S0CrUoaHtE8qlkgA0hMJjzgFQpXZl1r6HBCbj8OoreWZwoeysL%2FLedoA; 61m_cookietime=2592000; 61m_sid=6jgxcA
If-Modified-Since Tue, 19 Aug 2008 06:49:35GMT
If-None-Match 7936caeeaf6aee6ff8834b381618b513
Cache-Control max-age=0

Response Headers
Date Tue, 19 Aug 2008 06:50:19 GMT
Server Apache/2.0.47 (Win32) PHP/5.2.3
X-Powered-By PHP/5.2.3
Expires Tue, 19 Aug 2008 07:00:19 GMT
Last-Modified Tue, 19 Aug 2008 06:49:35GMT
Etag 7936caeeaf6aee6ff8834b381618b513
Content-Encoding gzip
Vary Accept-Encoding
Content-Length 421
Content-Type text/html; charset=utf-8
-------------------------------------------

-------------------------------------------
下面是用Http look监控到的内容,说明304头已经生效了
Request
GET /i33edu_v2/web/test/display_group HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: 61m_auth=97S0CrUoaHtE8qlkgA0hMJjzgFQpXZl1r6HBCbj8OoreWZwoeysL%2FLedoA; 61m_cookietime=2592000; 61m_sid=6jgxcA
If-Modified-Since: Tue, 19 Aug 2008 06:49:35GMT
If-None-Match: 7936caeeaf6aee6ff8834b381618b513
Cache-Control: max-age=0

Response
HTTP/1.1 304 Not Modified!
Date: Tue, 19 Aug 2008 06:50:19 GMT
Server: Apache/2.0.47 (Win32) PHP/5.2.3
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
Etag: 7936caeeaf6aee6ff8834b381618b513
Expires: Tue, 19 Aug 2008 07:00:19 GMT
Vary: Accept-Encoding

000000  1F 8B 08 00 00 00 00 00  00 03 D2 D5 25 19 D8 24  .?.......艺%.?
000010  15 29 E8 DB 71 A9 94 25  16 29 64 16 2B 24 2A 14  .)?q%.)d.+$*.
000020  97 14 65 E6 A5 EB 28 14  00 A9 12 85 C4 62 A8 00  ?e?.(..?吥b?
000030  54 5D 51 6A 62 8A 42 5A  51 7E AE 42 72 62 72 46  T]Qjb夿ZQ~瓸rbrF
000040  AA 95 0D 50 36 3F 2F DD  AE A6 C6 46 1F CA 54 80  獣.P6?/莓ζF.蔜?BR>000050  2A 25 DD 2D 30 C7 00 00  00 00 FF FF 03 00 4F BC  *%?0?...?..000060  32 45 C7 00 00 00                                 2E?..
O?
-------------------------------------------

-------------------------------------------
下面是用ie7的http watch监控的

GET /i33edu_v2/web/test/display_group HTTP/1.1
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
If-Modified-Since: Tue, 19 Aug 2008 07:09:35 GMT
If-None-Match: 7936caeeaf6aee6ff8834b381618b513
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; POTU(RR:27120522:0:5231843); Potu-WebBrowser www.potu.com; CIBA)
Host: localhost
Connection: Keep-Alive
Cookie: 61m_sid=nQbrC8

HTTP/1.1 304 Not Modified!
Date: Tue, 19 Aug 2008 07:10:47 GMT
Server: Apache/2.0.47 (Win32) PHP/5.2.3
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
Etag: 7936caeeaf6aee6ff8834b381618b513
Expires: Tue, 19 Aug 2008 07:20:47 GMT
Vary: Accept-Encoding

\u001F?
-------------------------------------------

HTTP头:If-Modified-Since, If-None-Match

参考网址:http://www.cnblogs.com/jams742003/archive/2010/02/01/1660912.html
  • summerviva
  • summerviva
  • 2014年10月28日 19:00
  • 1394

如何利用客户端缓存对网站进行优化? If-Modified-Since & If-None-Match

介绍         你的网站在并发访问很大并且无法承受压力的情况下,你会选择如何优化?         很多人首先会想从服务器缓存方面着手对程序进行优化,许多不同的服务器缓存方式都有他们自己...
  • jiana227
  • jiana227
  • 2012年07月10日 11:36
  • 3862

浏览器不发送If-None-Match 请求头部信息

为了提升性能,服务器端可以使用ETag利用本地缓存,避免多次重复的请求,然而自己在使用ETag的时候,发现无论是Chrome还是firefox,浏览器的请求头均没有发送If-None-Match头部,...
  • zlp1992
  • zlp1992
  • 2017年11月16日 14:52
  • 111

If-Modified-Since & If-None-Match

If-Modified-Since & If-None-Match   If-Modified-Since & If-None-MatchIf-Modified-Since,和 Last-M...
  • u013242080
  • u013242080
  • 2014年11月08日 10:50
  • 292

HTTP协议详解

当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等。 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了We...
  • sdgihshdv
  • sdgihshdv
  • 2017年11月09日 02:03
  • 89

ETag/If-None-Match

而ETag/If-None-Match则是上文大话中说的第二种check服务端文件是否更新的方式,也要配合Cache-Control使用。实际上ETag并不是文件的版本号,而是一串可以代表该文件唯一的...
  • lituanjieba
  • lituanjieba
  • 2015年07月30日 11:29
  • 349

Expires / Cache-Control / Last-Modified / If-Modified-Since / ETag / If-None-Match 的区别以及使用详解

本文主要讲解web缓存的应用. 为了演示体现缓存的作用,先删除所有的浏览器缓存,然后以如下四种方式访问baidu网站,期间使用Pagetest作为测试软件,这是一个搭配IE使用的软件,功能上...
  • jiana227
  • jiana227
  • 2012年07月10日 11:55
  • 7116

HTTP的请求头 Last-Modified 与 If-Modified-Since 和 If-None-Match 与 ETags

Last-Modified 与If-Modified-Since 都是用于记录页面最后修改时间的 HTTP 头信息. Last-Modified 是由服务器往客户端发送的 HTTP 头 If-...
  • wljk506
  • wljk506
  • 2013年11月08日 22:28
  • 2045

华为if-match子项

If-match子句用来定义路由策略的匹配条件,匹配对象是路由策略过滤器和路由信息的一些属性。     在一个路由策略节点中,如果不配置if-match子句,则表示路由信息在该节点匹配成功。如果配置...
  • jojoweng
  • jojoweng
  • 2016年05月09日 12:46
  • 296

使用OkHttp,Etags和If-Modified-Since减少网络流量

OkHttp3 网络优化
  • lihenair
  • lihenair
  • 2017年03月27日 10:02
  • 1077
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Etag/If-None-Match的用法
举报原因:
原因补充:

(最多只允许输入30个字)