`
dodolook
  • 浏览: 4158 次
  • 性别: Icon_minigender_1
  • 来自: 福建省福州市
最近访客 更多访客>>
社区版块
存档分类
最新评论

通过HTTP头控制浏览器的缓存

阅读更多
浏览器缓存是提高用户体验和提升程序性能的一个很重要的途径,通过浏览器的缓存控制,可以对实时性要求不高的数据进行缓存,可以减少甚至不需要再次对服务器的请求就可以显示数据。

本文将介绍如果通过HTTP协议中的header来控制浏览器的缓存行为,建议大家在看的时候写代码试验下,这样对这些header的理解会更深一点。

HTTP协议定义了四个可以用来控制浏览器缓存的HTTP头,它们是:

Last-Modified
Expires
Pragma: no-cache
Cache-Control

下面分别介绍HTTP/1.0和HTTP/1.1协议下的缓存解决方法。

HTTP/1.0

在HTTP/1.0协议中,Last-Modified是控制缓存的一个非常重要的HTTP头。如果需要控制浏览器的缓存,服务器首先必须发送一个以UTC时间为值的Last-Modifeid头,当第二次访问这个页面时,浏览器会发送一个If-Modified-Since头给服务器,让服务器判断是否有必要更新内容,这个If-Modified-Since头的值就是上次访问页面时,浏览器发送的Last-Modifeid头的值。

Expires是HTTP/1.0中另外一个很重要的HTTP头,它表示缓存的存在时间,告诉客户端浏览器在这个时间之前不对服务器发送请求,而直接使用浏览器的缓存。

在HTTP/1.0中,可以使用Pragma: no-cache头来告诉浏览器不要缓存内容,它相当于HTTP/1.1中的Cache-Control:no-cache。

如果要使用HTTP/1.0协议来告诉客户端(包括任何中介代理)是否要缓存数据,可以使用以下代码,如果设置liftTime参数则告诉客户端数据缓存的生命期为lifeTime的值:

function http_10_cache_headers($lifeTime = null){
	$gmtime = time();
	if ($lifeTime){
		$gmtime += $lifeTime;
	}else {
		header("Pragma: no-cache");
	}
	$gmtime = gmdate('D, d M Y H:i:s',$gmtime).' GMT';
	header("Last-Modified: $gmtime");
	header("Expires: $gmtime");
}


HTTP/1.0协议的这种实现方式的缺点是,服务器和客户端的时间有可能是不同步的,这样会造成缓存的实现达不到预期效果。HTTP/1.1协议用Cache-Control头解决了这个问题。

HTTP/1.1

Cache-Control响应头的语法为:
Cache-Control = “Cache-Control” “:”; #缓存响应指令

缓存响应指令为一下几个中的任意一个:

   1. public
   2. private
   3. no-cache
   4. no-store
   5. no-transform
   6. must-revalidate
   7. proxy-revalidate
   8. max-age=时间
   9. s-maxage=时间

详细介绍一下这几个指令的具体含义:

   1. public 指示响应数据可以被任何客户端缓存
   2. private 指示响应数据可以被非共享缓存所缓存。这表明响应的数据可以被发送请求的浏览器缓存,而不能被中介所缓存
   3. no-cache 指示响应数据不能被任何接受响应的客户端所缓存
   4. no-store 指示所传送的响应数据除了不能被缓存,也不能存入磁盘。一般用于敏感数据,以免数据被复制。
   5. must-revalidate 指示所有的缓存都必须重新验证,在这个过程中,浏览器会发送一个If-Modified-Since头。如果服务器程序验证得出当前的响应数据为最新的数据,那么服务器应当返回一个304 Not Modified响应给客户端,否则响应数据将再次被发送到客户端。
   6. proxy-revalidate 与must-revalidate相似,不同的是用来指示共享缓存。
   7. max-age 数据经过max-age设置的秒数后就会失效,相当于HTTP/1.0中的Expires头。如果在一次响应中同时设置了max-age和 Expires,那么max-age将具有较高的优先级。
   8. s-maxage 与max-age相似,不同的是用来指示共享缓存。

了解这些指令后就可以根据不同的需求来发送不同的HTTP头。

根据响应的内容是否更改来确定是否发送新的响应数据:
function validate_cache_headers($my_modtime)
{
    $pretty_modtime = gmdate('D, d M Y H:i:s', $my_modtime) . ' GMT';
    if($_SERVER['IF_MODIFIED_SINCE'] == $gmt_mtime) {
        header("HTTP/1.1 304 Not Modified");
        exit;
    }
    else {
        header("Cache-Control: must-revalidate");
        header("Last-Modified: $pretty_modtime");
    }
}


这个函数接受一个页面最后修改的时间作为参数,将它与浏览器发送的If-Modified-Since的时间比较,如果两者相同,说明缓存的数据版本是最新的,就可以发送一个304状态码给浏览器,让它使用缓存的数据;否则,发送新的Last-Modified头和设置必须验证缓存的数据版本的 Cache-Control头。

如果想要让响应数据被代理缓存一分钟,可以这么做:

function cache_novalidate($interval = 60)
{
    $now = time();
    $pretty_lmtime = gmdate('D, d M Y H:i:s', $now) . ' GMT';
    $pretty_extime = gmdate('D, d M Y H:i:s', $now + $interval) . 'GMT';
    // 向后兼容HTTP/1.0
    header("Last Modified: $pretty_lmtime");
    header("Expires: $pretty_extime");
    // 支持HTTP/1.1
    header("Cache-Control: public,max-age=$interval");
}


如果只想让浏览器缓存响应数据,可以这么做:

function cache_browser($interval = 60)
{
    $now = time();
    $pretty_lmtime = gmdate('D, d M Y H:i:s', $now) . ' GMT';
    $pretty_extime = gmdate('D, d M Y H:i:s', $now + $interval) . ' GMT';
    // 向后兼容HTTP/1.0
    header("Last Modified: $pretty_lmtime");
    header("Expires: $pretty_extime");
    // 支持HTTP/1.1
    header("Cache-Control: private,max-age=$interval,s-maxage=0");
}


如果要让数据不被任何客户端缓存:

function cache_none($interval = 60)
{
  // 向后兼容HTTP/1.0
  header("Expires: 0");
  header("Pragma: no-cache");
  // 支持HTTP/1.1
  header("Cache-Control: no-cache,no-store,max-age=0,s-maxage=0,must-revalidate");
}


当调用session_start()时,PHP会自动发送一个no-cache类的头来阻止缓存数据,

要注意的是:
通过POST方法发送的请求不能以如上所述的方式缓存。
分享到:
评论

相关推荐

    浏览器缓存机制介绍与缓存策略剖析.pptx

    浏览器缓存机制介绍与缓存策略...浏览器缓存机制是浏览器优化页面加载速度的一种手段,通过合理地使用缓存,可以减少服务器的压力和提高页面加载速度。但是,缓存机制也需要遵循一定的规则,以免出现缓存失效的问题。

    HTTP+JS+浏览器缓存技术

    Cache-Control 是 HTTP 1.1 中引入的新策略,用于控制浏览器缓存的行为。Cache-Control 的优点是可以实时更新缓存,且可以根据不同的需求设置不同的缓存策略。Cache-Control 的值可以是 public、private、no-cache、...

    Loadrunner负载测试 浏览器缓存设置

    在LoadRunner中,可以通过在HTTP协议初始化函数(http_init())中设置`web_set_sockets_option("HDR_RESERVE", "0")`来实现这一目标,这样将确保每次请求都发送完整的HTTP头,包括那些控制缓存的头。 2. **启用缓存...

    jsp去除浏览器缓存

    在JSP页面中可以通过设置HTTP响应头来实现去除浏览器缓存的目的。下面介绍几种常见的方法: ##### 1. 使用JSP内置对象`response` 在JSP页面中可以直接通过`response`对象来设置HTTP响应头,从而实现去除缓存的目标...

    浏览器缓存查看及恢复工具

    这涉及到HTTP协议中的Cache-Control、ETag、Last-Modified等头信息,用于控制缓存策略。 “浏览器缓存查看及恢复工具”是一款国外软件,专门用于查看和管理不同浏览器的缓存数据。这类工具通常具有以下功能: 1. *...

    Http通过响应头控制浏览器行为

    本主题将深入探讨HTTP通信中的消息头与响应头,以及如何通过它们来控制浏览器行为。我们将以一个简单的示例项目"HttpTest"为背景,分析相关知识点。 一、HTTP消息头与响应头 1. HTTP消息结构:HTTP请求由三部分...

    浏览器HTTP缓存机制

    - **响应报文**: 包含200 OK状态码和相应的缓存控制头信息。 #### 七、总结 HTTP缓存机制通过减少网络流量和提高响应速度,极大地优化了用户的Web体验。了解这些基本概念有助于开发者更好地控制资源的缓存行为,...

    浏览器HTTP缓存运行机制流程图.zip

    同时,Service Worker技术也是现代浏览器缓存的重要组成部分,它允许开发者更精细地控制离线缓存和预加载策略。 理解并合理利用这些机制,可以有效地减少网络传输,提升用户体验。例如,设置合适的缓存策略可以减少...

    浏览器缓存策略Httpwatch

    在实践中,可以通过设置HTTP响应头来管理浏览器缓存。例如,可以使用`Cache-Control: max-age=3600`告诉浏览器资源在1小时内有效,或者使用`ETag`和`Last-Modified`来验证资源是否更新。 在静态页面测试中,可以...

    清除浏览器缓存

    `Pragma:no-cache`是一个非标准但广泛支持的HTTP头,它用于指示代理服务器和浏览器不要缓存请求。 2. **`<meta http-equiv="cache-control" content="no-cache">`** - **作用**:`Cache-Control:no-cache`是一个...

    禁止浏览器缓存当前文档内容

    为了防止这种情况,可以通过设置HTTP响应头来禁止浏览器缓存当前页面。以下是三种常用的响应头字段: 1. `Expires`: 这个字段用来设置一个远期的日期,当该日期过去后,浏览器会认为资源已经过期,从而重新向服务器...

    Http页面缓存机制

    Cache-Control 是一种控制浏览器缓存的规则,它可以控制浏览器缓存的时长和频率。 Cache-Control 规则可以设置缓存的时长,例如 Cache-Control: max-age=3600,可以设置缓存的时长为一小时。 Etag 是一种控制...

    浏览器缓存机制 mindMaster脑图与visio流程图

    浏览器缓存机制是互联网浏览体验中的重要组成部分,它极大地提高了网页加载...通过“浏览器缓存机制-脑图.emmx”和“浏览器缓存流程及协商缓存流程.vsdx”这两个文件,我们可以更清晰地了解这一复杂但至关重要的技术。

    web项目页面缓存清除,不用每次刷新浏览器

    1. **HTTP缓存机制**:HTTP协议中的Cache-Control、ETag、Last-Modified等头部信息用于控制浏览器如何缓存和验证资源。例如,设置Cache-Control为`no-cache`或`no-store`可以防止浏览器缓存页面,`must-revalidate`...

    2024年浏览器缓存HTTP缓存机制(面试常考).zip

    通过通俗易懂的语言,本博客介绍了浏览器缓存的工作原理,HTTP缓存控制字段,缓存策略的应用,以及面试中可能遇到的关于缓存的问题和实战演练。此外,还探讨了缓存的高级话题,如缓存头字段、缓存与性能的关系,以及...

    浏览器缓存机制面试常考.zip

    通过通俗易懂的语言,本博客介绍了浏览器缓存的工作原理,HTTP缓存控制字段,缓存策略的应用,以及面试中可能遇到的关于缓存的问题和实战演练。此外,还探讨了缓存的高级话题,如缓存头字段、缓存与性能的关系,以及...

    浏览器缓存技术介绍以及优化建议

    通过设置HTTP响应头,如`Expires`和`Cache-Control`,可以控制资源的缓存策略。强缓存通过这些头部直接决定是否使用缓存,而协商缓存则通过`Last-Modified`/`If-Modified-Since`或`ETag`/`If-None-Match`与服务器...

    浏览器缓存问题5个.docx

    综上所述,浏览器缓存问题的解决需要综合考虑多个方面,包括但不限于HTTP缓存策略的合理设置、缓存污染的预防、个性化内容的安全处理、磁盘空间的有效管理和跨域资源共享的安全控制。通过上述措施的应用,可以有效...

    infrared-remote-浏览器缓存demo

    总的来说,这个demo为学习和实践浏览器缓存提供了一个有趣的实例,帮助开发者理解如何通过缓存策略提升网页性能,特别是对于那些需要快速响应的交互式应用,如红外遥控控制。通过分析和实验,我们可以学到如何编写...

    初探浏览器缓存实现原理-提高性能

    在实际应用中,开发者可以通过设置合适的缓存策略,结合`Cache-Control`和`Expires`等头部信息,控制浏览器缓存行为。例如,对于静态资源,可以设置较长的缓存时间,减少不必要的网络请求;对于动态内容,可能需要更...

Global site tag (gtag.js) - Google Analytics