设为首页 收藏本站
查看: 831|回复: 0

[经验分享] 大话PHP缓存头

[复制链接]

尚未签到

发表于 2015-8-25 07:00:27 | 显示全部楼层 |阅读模式
  304的请求机制和200有什么不一样呢?在fiddler中查看304请求的时候突然想到这个问题,就想到研究下这个304请求机制了。
  我们自己在nginx上放一个文件,test.png。可以使用下面的地址进行访问:
  http://test.yejianfeng.com/test.png
  
  nginx配置文件如下:
DSC0000.png
  这个的etag关闭是由于nginx默认是开启etag的,说明见ngx_http_core_module(http://nginx.org/en/docs/http/ngx_http_core_module.html)。
  现在我把etag关闭了,这个test.png的HTTP请求如下:
DSC0001.png
  可以看到这里的Response Header 中Last-Modified并没有设置过期,所以Last-Modified是不生效的。加上没有其他的相关缓存头,这个时候,浏览器就没有缓存这个页面了。所以呢,不管你黏贴URL,F5 还是Ctrl F5,页面进行的请求Cache-Control都是设置no-cache,所以服务端响应都是200。
  下面,修改nginx配置,增加一个expires 1d:
DSC0002.png
  重启nginx,HTTP请求如下:
DSC0003.png
  可以看出这里的Expires比Date多一天,所以就是服务端告诉客户端,你给我在本地缓存一天吧。
  那么这个时候使用F5:
DSC0004.png
  返回的就是304了,这个时候,就是本地浏览器缓存了这个页面,发送条件请求给服务端,条件请求里面带一个If-Modified-Since,客户端询问服务端,这个文件浏览器这边有缓存,如果你服务端的文件在这个时间点有更改,就发送一个更改后的文件给我,没有的话就发送一个304就好。
  这里还有个问题,这个Last-Modified是怎么定的呢?它就是这个文件在服务器上的最后修改时间。
DSC0005.png
  图中的15:31和last-Modified的07:31中间的8个小时是时区导致的。
  我们touch来修改这个文件的最后修改时间:
DSC0006.png
  然后再F5下这个URL:
DSC0007.png
  服务端返回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响应
DSC0008.png
  所以这里可以验证之前的文章:HTTP缓存相关头(http://www.cnblogs.com/yjf512/p/3244882.html)里面说的三种刷新的行为。
  
  回到缓存头,清空浏览器的缓存,把expire的设置去掉,把etag打开
DSC0009.png
  第一次访问:
DSC00010.png
  看到这里使用ETag了,ETag就相当于一个版本号,HTTP协议中并没有规定etag的算法,它的具体计算就依靠web服务器自身了。ETag还有普通和弱ETag的区分(http://en.wikipedia.org/wiki/HTTP_ETag)。
  第二次访问的时候:
DSC00011.png
  客户端发送请求中有个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进行判断了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103718-1-1.html 上篇帖子: PHP Smarty通过gettext制作多语言版本 下篇帖子: php的SAPI,CLI SAPI,CGI SAPI
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表