• 注册
  • 前端后端 前端后端 关注:1 内容:71

    PHP 静态页&动态页禁止浏览器缓存+刷新,转到,强制刷新的区别

  • 查看作者
  • 打赏作者
  • 帅气冲天

    问题前言

    虽说设置缓存确实给我们服务器减轻了运算及减少了带宽;

    但是有些网页需要实时加载,这种该怎么禁止游览器缓存呢?

    在html代码里已经设置了禁止缓存的http头,在某些游览器中,为什么还是加载的缓存

    解决方案

    这里设置禁止缓存分静态网页和动态网页,写了这篇帖子,望大家不要踩坑

    一、对于静态页(就是通过meta标签来设置)

    <!-- expires用于设定网页的过期时间,一旦过期就必须从服务器上重新加载.时间必须使用GMT格式 -->
    <meta http-equiv="expires" content="0" />

    或者通过pragma no-cache来设置,pragma出现在http-equiv属性中,使用content属性的no-cache值表示是否缓存网页(为了提高速度一些浏览器会缓存浏览者浏览过的页面,通过下面的定义,浏览器一般不会缓存页面,而且浏览器无法脱机浏览)。

    <meta http-equiv="pragma" content="no-cache" />

    Cache-Control:即缓存控制,指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。 请求时的缓存指令有 no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached等,响应消息中的指令有 public、private、no-cache、no-store、no-transform、must-revalidate、 proxy-revalidate、max-age。各个消息中的部分指令含义如下:

    Public:指示响应可被任何缓存区缓存。 

    Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 

    no-cache:指示请求或响应消息不能缓存 

    no-store:用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 

    max-age:指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 

    min-fresh:指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 

    max-stale:指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

    注意:Cache-Control 头标是在HTTP1.1里添加的,相对于其他几种方式能够实现更细致的缓存控制。

    <meta http-equiv="Cache-Control" content="no-cache,no-store, must-revalidate">
    // 缓存1天,表示最大生存期是1天,超过1天浏览器必须去服务器重新读取,这个时间是从用户第一次读取页面时开始计时的
    header('Cache-Control: max-age=3600*24');

    二、对于PHP页面

    对于动态页面,缓存的代码必须放在任何HTML标签输出之前,否则将会出错。

    <?php 
    header('Cache-Control:no-cache,must-revalidate');   
    header('Pragma:no-cache');   
    header("Expires:0"); 
    ?>

    Last-Modified:文档的最后修改时间。它的用法就是:

    1:如果是静态文件,客户端会发上来它缓存里的时间,apache会来比对,如果发现没有修改就直接返回一个头,状态码是304,字节数非常少。

    2:如果是php动态文件,客户端发上比对时间,php会判断是否修改,如果修改时间相同,就只会返回1024字节,至于为什么返回1024不得而知,如果你的php生成的文件非常大,它也只返回1024,所以比较省带宽,客户端会根据服务器端发过来的修改时间自动从缓存文件里显示。

    注意:如果没有设置 Last-Modified 头,只设置了Cache-Control和Expires也是可以起作用的,但每次请求要返回真实的文件字节数,而不是1024

    php 设置 Last-Modified 头标示例代码如下:

    // 使用的是格林尼治时间,$time是指文件添加时候的时间戳
    header('Last-Modified: '.gmdate('D, d M Y 01:01:01',$time).' GMT');

    三、刷新,转到以及强制刷新的区别

    浏览器上有刷新和转到按键,有的浏览器支持用ctrl+F5强制刷新页面,它们的区别是

    转到:用户点击链接就是转到,它完全使用缓存机制,如果有Last-Modified那么不会和服务器通讯,用抓包工具可以查看到发送字节是0byte,如果缓存过期,那么它会执行F5刷新的动作。

    刷新(F5):这种刷新也是根据缓存是否有Last-Modified来决定,如果有会转入304或1024(php),如果没有最后更新时间那么去服务器读取,返回真实文档大小。

    强制刷新(ctrl+F5):完全抛弃缓存机制,去服务器读取最新文档,向服务器发送的header如:Cache-Control: no-cache 指令。

    使用说明

    请根据自己实际情况做相应修改

    请登录之后再进行评论

    登录

    我关注的论坛

    暂没有数据

  • 发布内容
  • 做任务
  • 偏好设置
  • 直达底部
  • 帖子间隔 侧栏位置: