2019独角兽企业重金招聘Python工程师标准>>>

-by 落杉

客户端缓存控制通常也会被叫做条件GET请求。

五种常用于控制客户端缓存的头标

  • Last-Modified (最后修改时间)
  • ETag (实体标签)
  • Expires (有效指示)
  • Pragma (编译指示)
  • Cache-Control (缓存控制)

1.Last-Modified

这个头标是一个响应头标,表示客户端(通常指浏览器)所请求资源在服务器端的最后修改时间,通常情况下客户端在接受这个头标后,在以后对这个资源的 请求会附带一个'If-Modified-Since'请求头标,而这个头标是想告诉服务器上次客户端所请求资源的最后修改时间,对于一些图 像,css,js等静态文件资源,配置好了的apache服务器会理解这些If-Modified-Since请求头标,将头标里的时间和文件的最后修改 时间进行比较并作出响应,如果二者相等则发送一个304 Not Modfied来告诉客户端所请求资源并未修改让客户端放心使用缓存中的资源,否则的话会重新发送一个新的资源和新的Last-Modified的头标。 但是对于一个动态的PHP脚本,我们即使在脚本加入了header('Last Modified: '.$time)来发送一个Last Modified响应头标,当客户端附带'If-Modified-Since'在次请求时apache服务器不会进行处理,这需要我们自己 用$_SERVER['HTTP_IF_MODIFIED_SINCE']来获取'If-Modified-Since'的值自己来进行判断处理。

2.ETag

ETag(Entity Tag)和Last-Modified类似,也是WEB服务器和客户端用于确认缓存组件的有效性的一种机制,apache 1.3和2.0的ETag格式是inode-size-timestamp,因此当资源被修改,其ETag也发生改变,ETag相对Last- Modified更精确,Last-Modified只能精确的s级别,但是ETag在多服务器可能造成混乱,所以用还是不用还得看实际情况,其相对应的 后续请求头标为If-None-Match。

3.Expires

Expires表明缓存何时因该过期(GMT时间),属于HTTP 1.0 标准,通常是用来对Cache-Control的max-age的一个补充,来兼容HTTP 1.0,不赞成单独使用Expires,因为客户端时间容易发生偏差。

4.Pragma

HTTP 1.0 标准,通常是在不缓存时使用,Pragma: no-cache。

5.Cache-Control

Cache-Control常用指令(暂时我还没找到完整版本的)

public 可以在任何地方缓存
private 只能被浏览器缓存
no-cache 不能在任何地方缓存
must-revalidate 缓存必须检查跟新版本
proxy-revalidate 代理缓存必须检查跟新版本
max-age 内容能够被缓存的时间
s-maxage 覆盖共享缓存的max-age设置

浏览器行为影响

在先前有效访问后,在以后对同一URI资源的请求中,浏览器只进行两种动作:(1)直接在缓存中去获取内容。如果先前有效访问的响应头包含 Expires,max-age的话,'打开新窗口' '输入URI回车' '前一页' '后一页'这些浏览器行为不会使浏览器在Expires,max-age设置的有效期时间内去访问服务器,而是在缓存中去获取内容,但是' 刷新' 或 '重载'例外。(2)访问服务器,根据服务器响应来获取内容。这种情况发生在设置no-cache等头标要求不缓存,或者是设置了 Expires,max-age但浏览器行为是 ' 刷新' 或 '重载'时候。'Last-Modified' 'ETag' 'must-revalidate' 等有些特殊,不直接受浏览器行为影响,它们也是访问服务器后,再由服务器判断是发送新的资源,还是发送一个304 Not Modfied让浏览器使用缓存中的资源。

PHP代码
  1. <?php
  2. function  http_cache_control( $type = 'nocache' , $interval =0, $mktime = '' , $etag = '' ){
  3. if ( $type == 'nocache' ){
  4. header('Expires: -1' );
  5. header('Pragma: no-cache' );
  6. header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0' );
  7. }else {
  8. if (isset( $_SERVER [ 'HTTP_IF_NONE_MATCH' ]) &&  $etag  &&  $_SERVER ['HTTP_IF_NONE_MATCH' ] ==  $etag ){
  9. header('HTTP/1.1 304 Not Modfied' );
  10. }elseif (isset( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ]) &&  $mktime  &&  $_SERVER ['HTTP_IF_MODIFIED_SINCE' ] ==  gmdate ( 'r' , $mktime ). ' GMT' ){
  11. header('HTTP/1.1 304 Not Modfied' );
  12. }else {
  13. if ( $mktime ){
  14. $gmtime  =  gmdate ( 'r' , $mktime + $interval ). ' GMT' ;
  15. header('Expires: ' . $gmtime );
  16. }
  17. if ( $type == 'public' ){
  18. header('Cache-Control: public,max-age=' . $interval );
  19. }elseif ( $type == 'private' ){
  20. header('Cache-Control: private,max-age=' . $interval . ',s-maxage=0' );
  21. }elseif ( $type == 'none' ){
  22. header('must-revalidate,proxy-revalidate' );
  23. }
  24. }
  25. $mktime && header( 'Last-Modified: ' . gmdate ( 'r' , $mktime ) . ' GMT' );
  26. $etag    &&  header( 'ETag: ' . $etag );
  27. }
  28. }
  29. ?>

转载于:https://my.oschina.net/bugyang/blog/121836

PHP客户端缓存控制相关推荐

  1. http 缓存分为客户端缓存和服务端缓存

    http 缓存分为客户端缓存和服务端缓存 1. 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加 ...

  2. Kafka Cluster元数据在客户端缓存采用的数据结构

    看Cluster类的数据结构 1个Node就代表1个Broker,也就代表了1台机器: private final List<Node> nodes; Set维护了Kafka没有被授权访问 ...

  3. cache:缓存在asp.net中如何管理?服务器端缓存?Session, Application, Cache objectscache ,客户端缓存?Cookies,ViewState...

    本文申明:本人凭着对英文和技术的热爱,根据自己有限的英文水平通过翻译文章以达到提高自身能力,如果有什么地方不对的,希望大家提意见. 目的:这篇文章将描述在asp.net中如何管理cache以及cach ...

  4. 无盘服务器读写缓存,无盘系统中实现网络磁盘本地写缓存控制的方法

    1. 一种无盘系统中实现网络磁盘本地写缓存控制的方法,所述的无盘系统中包括通过 网络与远程服务器相连接的客户端,其特征在于,所述的方法包括以下步骤:(1)客户端进行启动和初始化操作:(2)客户端根据服 ...

  5. 跨域验证cookie与缓存控制

    1. 是否能跨域完全取决于浏览器控制,浏览器可以直接拒绝发送跨域请求(服务器根本收不到),也可以发送给服务器等接收到返回信息后决定是否让它被读取. 2. 服务器并不能辨别请求是从哪个源发过来的,只有在 ...

  6. 优化网站设计(三):对资源添加缓存控制

    前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议.这方面的研究一直没有停止过,我在不同的场合也分享过这样的话题. 作为通用的原则,雅虎的工程师团队曾经给出过35个 ...

  7. HTTP缓存(HTTP Cacheing):缓存控制(Cache-Control)

    Table of Contents 不同种类的缓存 专用浏览器缓存 共享代理缓存 缓存操作的目标 控制缓存 该Cache-Control头 该Pragma头 新鲜 开发资源 缓存验证 电子标签 最后修 ...

  8. nxd无盘怎么设置服务器网卡,网众NxD 6.0无盘系统的客户端缓存设置

    网众NxD 6.0无盘系统的客户端缓存设置 网众NxD 6.0无盘系统的客户端缓存包含以下几个方面: 1) S盘缓存 网众特有的S盘,在NxD 6.0中真正实做了回写缓存.据测试,设置为128M即可有 ...

  9. HTTP缓存控制小结

    前言 通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本.因此,缓存和重用以前获取的资源的能力成为 ...

最新文章

  1. 机器人也需要拥有属于自己的性格
  2. C++ 派生类的定义
  3. rx在c语言中,RxSwift - 入门
  4. EOJ Monthly 2020.9 Sponsored by TuSimple E. 加密的情书
  5. 【报告分享】2021制造业与人工智能创新应用发展报告.pdf(附下载链接)
  6. Hybrid App技术批量制作APP应用与跨平台解决方案
  7. RGB数据保存为BMP图片
  8. python类带参数_Python函数参数传递机制(超级详细)
  9. 重设OS X (macOS)系统帐户密码的几种方法
  10. linux 进程间通信机制(IPC机制)一消息队列
  11. Session存放token/获取token,销毁session
  12. Windows下Pidgin介绍/安装配置图文攻略
  13. 第六章、面向对象的PHP
  14. mac 屏幕录制专家
  15. Maven项目自动更新/修复Javadoc
  16. 2.6顺序表和链表的优缺点(区别、特点)详解
  17. scrolltop一直为0_「超级玛丽max2.0」「达尔文3号」「超级玛丽max3.0」,三军之战最全解析...
  18. Rails 内置方法大全(慢慢积累中)
  19. Android逆向之旅---破解某支付软件防Xposed等框架Hook功能检测机制
  20. PCI ---百度百科

热门文章

  1. 动画函数requestAnimationFrame
  2. Asp.net上传文件限制,在大于5M的时候出现DNS解析错误,解决方法。
  3. FreeMarker Eclipse Plugin的安装!
  4. mysql在线检测失败_一则线上MySql连接异常的排查过程
  5. c语言编制编程语言,C语言CGI编程入门(一)
  6. php linux权限,Linux权限详细介绍
  7. 2051温控器c语言程序,2051电子钟C程序.doc
  8. kubernetes-Pod结构
  9. aop简介-基于cglib的动态
  10. 任务调度之Quartz1