`

有关客户端浏览器缓存的Http头介绍

阅读更多

做网站开发离不开缓存,缓存分好多种:服务器缓存,第三方缓存,浏览器缓存等。其中浏览器缓存是代价最小的,因为浏览器缓存依赖的是客户端,而几乎不耗费服务器端的资源。

让浏览器做缓存需要给浏览器发送指定的Http头,告诉浏览器缓存多长时间,或者坚决不要缓存。作为.net的程序员,其实我们一直都在用这种方法,在OutputCache指令中指定缓存的Location为Client时,其实就是给浏览器发送了一个Http头,告诉浏览器这个Url要缓存多长时间,最后修改的时间。

微软在OutputCacheModule中对这些缓存用到的Http头给我们进行了很好的封装,但是了解这些Http头可以更灵活的使用它们。

 

1.Expires(过期时间)HTTP头信息
Expires(过期时间) 属性是HTTP控制缓存的基本手段,这个属性告诉缓存器:相关副本在多长时间内是新鲜的。过了这个时间,缓存器就会向源服务器发送请求,检查文档是否被修改。几乎所有的缓存服务器都支持Expires(过期时间)属性;
 
大部分Web服务器支持你用几种方式设置Expires属性;一般的:可以设计一个绝对时间间隔:基于客户最后查看副本的时间(最后访问时间)或者根据服务器上文档最后被修改的时间;

Expires 头信息:对于设置静态图片文件(例如导航栏和图片按钮)可缓存特别有用;因为这些图片修改很少,你可以给它们设置一个特别长的过期时间,这会使你的网站对 用户变得相应非常快;他们对于控制有规律改变的网页也很有用,例如:你每天早上6点更新新闻页,你可以设置副本的过期时间也是这个时间,这样缓存 服务器就知道什么时候去取一个更新版本,而不必让用户去按浏览器的“刷新”按钮。

过期时间头信息属性值只能是HTTP格式的日期时间,其他的都会被解析成当前时间“之前”,副本会过期,记住:HTTP的日期时间必须是格林威治时间(GMT),而不是本地时间。举例:
Expires: Fri, 30 Oct 1998 14:19:41

所以使用过期时间属性一定要确认你的Web服务器时间设置正确,一个途径是通过网络时间同步协议(Network Time Protocol NTP),和你的系统管理员那里你可以了解更多细节。

虽然过期时间属性非常有用,但是它还是有些局限,首先:是牵扯到了日期,这样Web服务器的时间和缓存服务器的时间必须是同步的,如果有些不同步,要么是应该缓存的内容提前过期了,要么是过期结果没及时更新。

还有一个过期时间设置的问题也不容忽视:如果你设置的过期时间是一个固定的时间,如果你返回内容的时候又没有连带更新下次过期的时间,那么之后所有访问请求都会被发送给源Web服务器,反而增加了负载和响应时间;

 

2.Cache-Control(缓存控制) HTTP头信息
HTTP 1.1介绍了另外一组头信息属性:Cache-Control响应头信息,让网站的发布者可以更全面的控制他们的内容,并定位过期时间的限制。
有用的 Cache-Control响应头信息包括:

max-age=[秒] — 执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间,[秒]是一个数字,单位是秒:从请求时间开始到过期时间之间的秒数。
s-maxage=[秒] — 类似于max-age属性,除了他应用于共享(如:代理服务器)缓存
public — 标记认证内容也可以被缓存,一般来说: 经过HTTP认证才能访问的内容,输出是自动不可以缓存的;
no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据的应用(不惜牺牲使用缓存的所有好处);
no-store — 强制缓存在任何情况下都不要保留任何副本
must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的,HTTP允许缓存在某些特定情况下返回过期数据,指定了这个属性,你高速缓存,你希望严格的遵循你的规则。
proxy-revalidate — 和 must-revalidate类似,除了他只对缓存代理服务器起作用
举例:
Cache-Control: max-age=3600, must-revalidate

给静态资源(HTML文件,图片文件等)的Repsone加上Expires/Cache-Control Header是很有效的一招。如果HTTP Response中有Expires这样的Header的话,浏览器会Cache这个资源,理想状况下(注意,只是理想状况),在Expire Date之前,不会再发HTTP请求给Server要这个资源,不过Expires的值只能是一个固定日期,比如“Thu 27 Nov 2008 07:00:00 GMT”,不能是一个类似“从现在开始之后10年”这样一个随机浮动的值,如果要这样的效果,可以用Cache-Control这样的Header,如果 HTTP Resposne中有这样的Header:“Cache-Control: max-age = 100”,表示这个资源在cache中的最大寿命是100秒。一般说来这种静态文件永远不应该过期,如果真的要给这个Cache加上一个期限,那我希望是 ——一万年,“Cache-Control: max-age = 315360000000”

其实就应该给Expires设一个永远不会过期的时间,比如你现在有一个文件叫logo.gif,需要用一个新的logo的时候,你不要去 覆盖原来的文件,而把新的logo存成logo_v2.gif,让相关网页引用新的logo_v2.gif,这样可以让新老网页同时工作,实在犯不上为了 节省存储空间覆盖原有文件。

对Apache服务器,使用mod_expires,在httpd.conf或者.htaccess中加上

<FilesMatch "\\.(ico|gif|jpg|html)$">ExpiresDefault "access plus 10 years"</FileMatch>

 

3.Last-Modified/If-Modified-Since
有些数据随时都在变化。CNN.com 的主页经常几分钟就更新。另一方面,Google.com 的主页几个星期才更新一次 (当他们上传特殊的假日 logo,或为一个新服务作广告时)。 Web 服务是不变的:通常服务器知道你所请求的数据的最后修改时间,并且 HTTP 为服务器提供了一种将最近修改数据连同你请求的数据一同发送的方法。

如果你第二次 (或第三次,或第四次) 请求相同的数据,你可以告诉服务器你上一次获得的最后修改日期:在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期。如果数据从那时起没有改变,服务器将返回一个特殊的 HTTP 状态代码 304,这意味着 “从上一次请求后这个数据没有改变”。这一点有何进步呢?当服务器发送状态编码 304 时,不再重新发送数据。您仅仅获得了这个状态代码。所以当数据没有更新时,你不需要一次又一次地下载相同的数据;服务器假定你有本地的缓存数据。

所有现代的浏览器都支持最近修改 (last-modified) 的数据检查。如果你曾经访问过某页,一天后重新访问相同的页时发现它没有变化,并奇怪第二次访问时页面加载得如此之快——这就是原因所在。你的浏览器首次访问时会在本地缓存页面内容,当你第二次访问,浏览器自动发送首次访问时从服务器获得的最近修改日期。服务器简单地返回 304: Not Modified (没有修改),因此浏览器就会知道从本地缓存加载页面。在这一点上,Web 服务也如此智能。

4. ETag/If-None-Match
ETag 是实现与最近修改数据检查同样的功能的另一种方法:没有变化时不重新下载数据。其工作方式是:服务器发送你所请求的数据的同时,发送某种数据的 hash (在 ETag 头信息中给出)。hash 的确定完全取决于服务器。当第二次请求相同的数据时,你需要在 If-None-Match: 头信息中包含 ETag hash,如果数据没有改变,服务器将返回 304 状态代码。与最近修改数据检查相同,服务器仅仅 发送 304 状态代码;第二次将不为你发送相同的数据。在第二次请求时,通过包含 ETag hash,你告诉服务器:如果 hash 仍旧匹配就没有必要重新发送相同的数据,因为你还有上一次访问过的数据。

这几个http头可以作为meta标签发送到客户端,但是需要注意的是Http头中的设置优先级更高一些,例如:
<meta http-equiv="Expires" CONTENT=" Fri, 30 Oct 1998 14:19:41">
<meta http-equiv="Cache-Control" CONTENT="no-cache">


总结
Expires/Cache-Control Header是控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只是Cache-Control比Expires可以控制的多一些,而且Cache-Control会重写Expires的规则。

Last-Modified/If-Modified-Since和ETag/If-None-Match是浏览器发送请求到服务器后判断文件是否已经修改过,如果没有修改过就只发送一个304回给浏览器,告诉浏览器直接从自己本地的缓存取数据;如果修改过那就整个数据重新发给浏览器。

分享到:
评论

相关推荐

    asp.net 客户端浏览器缓存的Http头介绍

    让浏览器做缓存需要给浏览器发送指定的Http头,告诉浏览器缓存多长... 和客户端缓存相关的Http头有以下几个,分别是: 1. Expires:+过期时间 表示在指定时间后浏览器缓存失效,需要注意的是这儿的过期时间必须是HTTP

    E017-渗透测试常用工具-使用Beef对客户端浏览器进行劫持.pdf

    本文档介绍了一种常用的渗透测试工具——Beef,以及如何利用它对客户端浏览器进行劫持。 Beef(Browser Exploitation Framework)是一个基于Web的渗透测试框架,专门设计用于安全研究人员和渗透测试人员控制和操纵...

    浏览器缓存例子浏览器缓存例子浏览器缓存例子浏览器缓存例子

    浏览器缓存是前端开发中的重要概念,它对提高网页加载速度和减少服务器压力起到关键作用。浏览器缓存通过存储重复请求的资源,如HTML、CSS、JavaScript文件和图片,使得这些资源可以在用户再次访问时无需从服务器...

    浏览器缓存相关知识.zip

    浏览器缓存主要可以分为两大类:客户端缓存和服务端缓存。客户端缓存,即浏览器缓存,是本文主要讨论的内容。而服务端缓存则主要包括代理服务器缓存和反向代理服务器缓存,以及广泛使用的CDN等。这些服务端缓存技术...

    浏览器HTTP缓存机制

    ### 浏览器HTTP缓存机制详解 #### 一、概述 HTTP缓存机制是现代Web应用中的一个重要组成部分,它能够显著提升用户体验并减轻服务器...以上是对浏览器HTTP缓存机制的详细介绍,希望能帮助您更好地理解这一关键概念。

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

    例如,设置Cache-Control为`no-cache`或`no-store`可以防止浏览器缓存页面,`must-revalidate`则要求每次请求都验证资源是否更新。 2. **HTML5的Service Worker**:Service Worker是一种在浏览器后台运行的脚本,它...

    实现在客户端的页面缓存

    客户端缓存,也称为浏览器缓存,是Web浏览器为加快页面加载速度而存储的部分网页资源,如HTML、CSS、JavaScript文件、图片等。当用户再次访问同一页面时,浏览器会先从缓存中加载这些资源,而不是重新向服务器请求,...

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

    浏览器缓存机制是互联网浏览体验中的重要组成部分,它极大地提高了网页加载速度,减少了网络带宽的消耗。在本文中,我们将深入探讨浏览器缓存的工作原理,主要包括两种主要类型的缓存:强缓存(Strong Cache)和协商...

    浏览器之HTTP缓存的那些事

    本文将深入探讨HTTP缓存的基本概念、浏览器缓存机制以及与缓存相关的HTTP头部信息,帮助读者更好地理解并运用这些机制。 #### 二、什么是浏览器缓存 浏览器缓存是指将已请求过的Web资源(如HTML页面、图像文件、...

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

    【禁止浏览器缓存当前文档内容】 ...以上就是关于“禁止浏览器缓存当前文档内容”以及相关Web开发知识的详细介绍,希望对您有所帮助。在实际开发中,理解并正确运用这些技术可以提升用户体验并保障数据安全性。

    存储篇 1:浏览器缓存机制介绍与缓存策略剖析(1).md

    ### 浏览器缓存机制介绍与缓存策略剖析 浏览器缓存是前端性能优化的一个重要组成部分,其可以减少网络IO消耗,提高访问速度。浏览器缓存的机制可以分为四个方面:MemoryCache、ServiceWorkerCache、HTTPCache和...

    浏览器缓存问题5个.docx

    ### 浏览器缓存问题解析 #### 一、浏览器缓存未及时更新内容的问题 **问题描述**:用户在访问网站时,浏览器未能从服务器获取最新的资源,而是显示缓存中的旧版本内容。 **原因分析**:此问题通常由HTTP缓存策略...

    服务器端将数据推送到客户端(浏览器)

    在IT行业中,服务器端将数据推送到客户端(浏览器)是一种重要的通信模式,它与传统的HTTP请求-响应模型有所不同。在传统的HTTP模型中,客户端(通常是浏览器)需要主动发起请求来获取服务器上的信息,而服务器推送...

    js、css、img等浏览器缓存问题的2种解决方案.docx

    在 Web 开发中,浏览器缓存是非常重要的一部分,它可以提高网站的加载速度和执行效率,但同时也带来了许多问题,例如当服务端修改了 js、css 等文件时,客户端无法更新,这就需要我们采取一些方法来解决这些问题。...

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

    浏览器缓存是优化网站性能的关键技术之一,通过在客户端存储网页资源,如HTML、CSS、JavaScript文件和图片等,减少对网络带宽的消耗,加快页面加载速度,提升用户体验,并减轻服务器的压力。本文将深入探讨浏览器...

    Flex客户端IE浏览器缓存问题

    首先,我们需要理解浏览器缓存的工作原理。浏览器为了提高网页加载速度和减少网络带宽消耗,会将访问过的网页资源(如图片、CSS、JavaScript和SWF文件等)存储在本地缓存中。当用户再次访问同一网页时,浏览器会优先...

    【ASP.NET编程知识】ASP.NET MVC中使用jQuery时的浏览器缓存问题详解.docx

    在实际应用中,服务器端响应里设置No-Cache头信息可以禁用浏览器缓存。例如,在ASP.NET MVC中,可以使用Response.Cache.SetCacheability方法来设置No-Cache头信息。 另外,服务器端响应里设置过期时间也可以用于...

    面试题浏览器缓存和数据压缩.pdf

    以上就是对“面试题浏览器缓存和数据压缩.pdf”文件中提到的浏览器缓存机制和数据压缩相关知识点的详细介绍。希望这些内容能帮助你更好地理解和掌握这些技术点,为面试或实际工作中的应用场景打下坚实的基础。

    浅析http协议、cookies和session机制、浏览器缓存.docx

    本文将深入探讨HTTP协议的几个核心概念:HTTP头、Cookies、Session机制以及浏览器缓存。 首先,HTTP请求头和响应头是HTTP协议的重要组成部分,它们包含了关于请求和响应的元信息。在请求头中,例如`GET`方法、`Host...

Global site tag (gtag.js) - Google Analytics