大话PHP缓存头

304的请求机制和200有什么不一样呢?在fiddler中查看304请求的时候突然想到这个问题,就想到研究下这个304请求机制了。

我们自己在nginx上放一个文件,test.png。可以使用下面的地址进行访问:

http://test.yejianfeng.com/test.png

 

nginx配置文件如下:

这个的etag关闭是由于nginx默认是开启etag的,说明见ngx_http_core_module(http://nginx.org/en/docs/http/ngx_http_core_module.html)。

现在我把etag关闭了,这个test.png的HTTP请求如下:

可以看到这里的Response Header 中Last-Modified并没有设置过期,所以Last-Modified是不生效的。加上没有其他的相关缓存头,这个时候,浏览器就没有缓存这个页面了。所以呢,不管你黏贴URL,F5 还是Ctrl F5,页面进行的请求Cache-Control都是设置no-cache,所以服务端响应都是200。

下面,修改nginx配置,增加一个expires 1d:

重启nginx,HTTP请求如下:

可以看出这里的Expires比Date多一天,所以就是服务端告诉客户端,你给我在本地缓存一天吧。

那么这个时候使用F5:

返回的就是304了,这个时候,就是本地浏览器缓存了这个页面,发送条件请求给服务端,条件请求里面带一个If-Modified-Since,客户端询问服务端,这个文件浏览器这边有缓存,如果你服务端的文件在这个时间点有更改,就发送一个更改后的文件给我,没有的话就发送一个304就好。

这里还有个问题,这个Last-Modified是怎么定的呢?它就是这个文件在服务器上的最后修改时间。

图中的15:31和last-Modified的07:31中间的8个小时是时区导致的。

我们touch来修改这个文件的最后修改时间:

然后再F5下这个URL:

服务端返回200了,而且Last-Modified也修改了。这个就很好理解了。

 

如果我不是使用F5,而是将url直接贴到浏览器呢?这个时候,浏览器的行为就是如果本地有缓存,就使用本地的缓存,如果本地没有缓存,就请求服务端。

我们可以做的实验是这样:

1 开启fiddler

2 ctrl + F5,这个时候fiddler中多了一个200响应

3 F5,这个时候fiddler中多了一个304响应

4 打开一个新标签,在地址栏输入url:http://test.yejianfeng.com/test.png  这个时候会发现fiddler并没有任何请求

5 ctrl + F5,这个时候fiddler多一个200响应

所以这里可以验证之前的文章:HTTP缓存相关头(http://www.cnblogs.com/yjf512/p/3244882.html)里面说的三种刷新的行为。

 

回到缓存头,清空浏览器的缓存,把expire的设置去掉,把etag打开

第一次访问:

看到这里使用ETag了,ETag就相当于一个版本号,HTTP协议中并没有规定etag的算法,它的具体计算就依靠web服务器自身了。ETag还有普通和弱ETag的区分(http://en.wikipedia.org/wiki/HTTP_ETag)。

第二次访问的时候:

客户端发送请求中有个If-None-Match,表示客户端询问服务端,如果你这边的这个文件的tag还是XXXXX,就返回304吧,不是的话就返回200。

所以If-None-Match + ETag是可以控制文件在浏览器中的缓存的。

 

关于缓存的头,有些是客户端的:

Cache-Control

If-Modified-Since

If-None-Match

有些是服务端的:

Expire

Last-Modified

ETag

 

相关这些头的说明可以看这篇:HTTP缓存相关头(http://www.cnblogs.com/yjf512/p/3244882.html)

 

好了,下面说一种情景:

我们再nginx中做了一个rewrite,所有的js都重写到myjs.php这个脚本,那么问个问题,js在F5的时候会发送条件请求,这个条件请求是不是会触发php呢?

 

答案是会的。条件请求也是一个普通的php请求,它会在触发php的。这个时候如果你需要返回304的话,就需要你在php程序中对If-modified或者If-None-Match进行判断了。

时间: 2024-10-28 10:57:04

大话PHP缓存头的相关文章

HTTP缓存头Last-Modified和ETag介绍_win服务器

第一次请求 请求: 复制代码 代码如下: GET /pic/201408/102.jpg HTTP/1.1 Host: www.jb51.net Connection: keep-alive Cache-Control: no-cache Accept: image/webp,*/*;q=0.8 Pragma: no-cache User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chro

浏览器缓存机制浅析(转)

非HTTP协议定义的缓存机制 浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires: Cache-control等).但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下: <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 上述代码的作用是告诉浏览器当前页面不被缓存,每

性能优化之页面缓存(以Javascript方式缓存页面部件)

本篇文章为大家讲解一个关于客户端缓存页面的技巧--以Javascript的方式来缓存页面的静态"部件". 如果整个页面能够被缓存到浏览器上,一个满载HTML的巨大页面也能运行地很棒.你可以使用Http响应缓存头来解决这个问题,要么将它们手工注入你的代码,要么在aspx页面上使用@OutputCache标签来申明: <%@ OutputCache Location="Client" Duration="86400" VaryByParam=&

CDN缓存不命中排查

场景:CDN的作用在于就近缓存,缓存命中情况下对应资源的访问速度会相对较快,加速效果较好:如果CDN缓存命中率差,对应的CDN加速效果是相对不理想的,故提升CDN缓存命中率对于CDN加速效果有着重大影响,本文旨在让读者可以根据案例定位对应资源为何缓存不命中,如何才能缓存命中提高缓存命中率. 案例一:源站设置了no cache,private (1)Cache control设置nocache, private curl -I http://m.*.net/cha.html HTTP/1.1 20

Web 缓存欺骗攻击技术详解

本文讲的是Web 缓存欺骗攻击技术详解,Omer Gil早在今年年初就在他的博客上发表了有关于Web缓存欺骗攻击技术的博文,随后他在BlackHat USA 2017 和BSides Tel-Aviv 2017 上对这种攻击技术进行了演示,并做了更深入的研究. 在他发布的"Web 缓存欺骗技术白皮书"中,详细的介绍了这种攻击技术.这份白皮书大致包含了如下内容: ·攻击原理概述 ·实施攻击的方法 ·攻击所需的条件 ·已知的几个主流的Web 框架及缓存机制 ·缓解措施 Web缓存欺骗这种攻

一篇文读懂缓存在大型分布式系统中的最佳应用

本文大纲: 缓存概述 CDN缓存 反向代理缓存 分布式缓存 本地缓存 缓存架构示例 缓存常见问题        一.缓存概述       缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题.提供高性能的数据快速访问.   1.缓存的原理   将数据写入/读取速度更快的存储(设备): 将数据缓存到离应用最近的位置: 将数据缓存到离用户最近的位置.   2.缓存分类   在分布式系统中,缓存的应用非常广泛,从部署角度有以下几个方面的缓存应用.   CDN缓存: 反向代

新型Web攻击技术——Web缓存欺骗

本文讲的是新型Web攻击技术--Web缓存欺骗,Web缓存欺骗是一种新的Web攻击向量,这种攻击技术的出现使得多种Web缓存技术和框架面临风险. Web缓存和服务器反应的一点介绍 很多网站通常都倾向于使用web缓存功能(例如通过CDN,负载均衡器或简单的反向代理).使用Web缓存功能的目的很简单:存储那些经常检索的文件,以减少Web服务器响应的延迟. 让我们来看一个网络缓存的例子.网站http://www.example.com通过配置了反向代理作为Web缓存.存储在服务器上并需要返回用户个人内

关于Web缓存的那些风流事儿

最近大家针对preload.HTTP/2 push和ServiceWorker的浏览器缓存实现展开了激烈的讨论,而这也引起了很多人的疑惑. 鉴于此,我想讲个故事来让大家了解一个请求如何完成他的使命并找到匹配的缓存资源,以下内容均基于 Chromium 的术语,不过其余浏览器的实现本质上没有太大的差异. Questy 的旅程 Questy 是一个请求.她是在渲染引擎内(也叫渲染器)诞生的.她渴望能在这个标签页关闭前找到一个让她的"人生"再无遗憾的资源. 所以 Questy 展开了她追求幸

大型web站点缓存策略经验总结

缓存策略 浏览器端的缓存规则 对于浏览器端的缓存来讲,这些规则是在HTTP协议头和HTML页面的Meta标签中定义的.他们分别从新鲜度和校验值两个维度来规定浏览器是否可以直接使用缓存中的副本,还是需要去源服务器获取更新的版本. 新鲜度(过期机制):也就是缓存副本有效期.一个缓存副本必须满足以下条件,浏览器会认为它是有效的,足够新的:     含有完整的过期时间控制头信息(HTTP协议报头),并且仍在有效期内:    浏览器已经使用过这个缓存副本,并且在一个会话中已经检查过新鲜度 满足以上两个情况