`
真爱无敌
  • 浏览: 23160 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

HTTP头中与缓存相关的几个参数

    博客分类:
  • JS
阅读更多

1.Expires(过期时间)HTTP头信息

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

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

过期时间头信息属性值只能HTTP格式的日期时间,其他的都会被解析成当前时间之前,副本会过期,记住:HTTP的日期时间必须是格林威治时间(GMT),而不是本地时间。举例:vCbLinux联盟

Expires: Fri, 30 Oct 1998 14:19:41 GMTvCbLinux联盟

所以使用过期时间属性一定要确认你的Web服务器时间设置正确,一个途径是通过网络时间同步协议(Network Time Protocol NTP),和你的系统管理员那里你可以了解更多细节。vCbLinux联盟
虽然过期时间属性非常有用,但是它还是有些局限,首先:是牵扯到了日期,这样Web服务器的时间和缓存服务器的时间必须是同步的,如果有些不同步,要么是应该缓存的内容提前过期了,要么是过期结果没及时更新。vCbLinux联盟
还有一个过期时间设置的问题也不容忽视:如果你设置的过期时间是一个固定的时间,如果你返回内容的时候又没有连带更新下次过期的时间,那么之后所有访问请求都会被发送给源Web服务器,反而增加了负载和响应时间;vCbLinux联盟

2.Cache-Control(缓存控制) HTTP头信息

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

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

举例:vCbLinux联盟

Cache-Control: max-age=3600, must-revalidatevCbLinux联盟

给静态资源(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 仍旧匹配就没有必要重新发送相同的数据,因为你还有上一次访问过的数据。

5. 压缩 (Compression)

最后一个重要的 HTTP 特性是 gzip 压缩。 关于 HTTP web 服务的主题几乎总是会涉及在网络线路上传输的 XMLXML 是文本,而且还是相当冗长的文本,而文本通常可以被很好地压缩。当你通过 HTTP 请求一个资源时,可以告诉服务器,如果它有任何新数据要发送给我时,请以压缩的格式发送。在你的请求中包含 Accept-encoding: gzip 头信息,如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用 Content-encoding: gzip 头信息标记。

6.总结

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

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

 

0
0
分享到:
评论

相关推荐

    hibernate 3中的缓存小结

    evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象。 2.3. 二级缓存的管理: 2.3.1. Hibernate的二级缓存策略的一般过程如下: 1) 条件查询的时候,总是发出一条select * ...

    Smartdrv磁盘高速缓存

    Smartdrv.exe这个文件在Windows各个版本的安装光盘中或是硬盘上的Windows/command/里都有,只有几十KB,把这个文件复制到软盘下,启动系统后DOS下直接运行这个程序(可以不加参数,该程序会自动根据内存大小分配适当...

    三菱PLC QD77MS 多个程序运用例子+参数手册.zip

    常用参数内部缓存区讲解程序 MS2和MS4/MS16的JOG及原点程序 绝对定位 相对定位 速度 位置 单独连续控制 设置程序例子 让马达按规定速度一直转动 一直正转或者反转程序例子 中途走了一节 停止了 如何重新启动程序...

    论文研究-有界延迟下FDL缓存队列性能分析.pdf

    在提出的模型中,根据缓冲区剩余工作量的概率分布,开发出一个递归方程组用于计算缓存中分组丢失的数量,同时得到几种相关性能参数的解析表达式。重点研究了增加冗余包对缓存性能的影响,并评估不同FEC编码方案的...

    Oracle9i的init.ora参数中文说明

    说明: 与 NLS_TIME_FORMAT 相似, 只不过它设置的是 TIMESTAMP 数据类型的默认值, 该数据类型既存储YEAR, MONTH 和 DAY 这几个日期值, 也存储 HOUR, MINUTE 和 SECOND 这几个时间值。 语法: TIMESTAMP '1997-01-31 ...

    mysql的查询缓存说明

    对mysql查询缓存从五个角度进行详细的分析:...查询缓存对什么样的查询语句,无法缓存其记录集,大致有以下几类:查询语句中加了SQL_NO_CACHE参数;查询语句中含有获得值的函数,包涵自定义函数,如:CURDATE()、GET_LO

    jquery 缓存问题的几个解决方法

    解决办法几个: 1.使用.ajax方法并设置 cache参数为false 代码如下: $.ajaxSetup ({ cache: false }); $(fucntion({ $.ajaxSetup ({ cache: false }); })) 在每次执行load方法前执行,注意不能设置为全局属性 可以...

    all-keep-alive:一个后台管理的tabs页面例子,打开的tabs页会有缓存,关闭之后清除缓存。包含同一个组件的多次复用的tabs

    一个升级版的keep-alive,可以用来缓存所有的页面,包括复用页面。 可以在实现一些多标签页面,打开标签需要缓存页面数据的场景下使用 install npm install all-keep-alive 使用 import { allKeepAlive } from 'all-...

    SpringBoot笔记-下篇.pdf

    三、几个重要概念&缓存注解 1、常用注解 2、常用参数 名字 位置 描述 示例 methodName root object 当前被调用的方法名 #root.methodName method root object 当前被调用的方法 #root.method.name target root ...

    Oracle中自动共享内存管理特性深入分析

    一个 Oracle 例程的系统全局区域 (SGA) 包含几个内存区域(包括缓冲高速缓存、共享池、Java 池、大型池和重做日志缓冲)。这些池在操作系统的内存空间中占据了固定的内存数;它们的大小由 DBA 在初始化参数文件中...

    mysql数据库优化必会的几个参数中文解释

    当cpu需要超出适合cpu缓存的数据时,缓存的带宽就成了内存的一个瓶颈—不过现在内存大的惊人,一般不会出现这个问题. 第二步: (本人使用的是学校网站的linux平台(Linux ADVX.Mandrakesoft.com 2.4.3-19mdk ))

    js文件缓存之版本管理详解

    近几个月来的工作是一个交易系统持续改进项目,迭代发布周期大约为2~3周。最近一次迭代是V16版,在礼拜三完成发布。不幸的是,第二天上午就被老大逮过去。原来老大从生产中揪出了一个bug,大致的问题如下: 系统中有...

    网络安全技术参数(1).docx

    网络安全技术参数(1)全文共10页,当前为第1页。...(5)、投标产品符合GA/T 698-2007信息安全技术 信息过滤产品安全功能要求(基本级)中相应的条款所述的有关要求,提供公安部信息过滤产品安全功能测

    网络安全技术参数.docx

    网络安全技术参数全文共10页,当前为第1页。网络安全技术参数 网络安全技术参数全文共10页,当前为第1页。 网络安全技术参数全文共10页,当前为第2页。2)、校园网络系统 网络安全技术参数全文共10页,当前为第2页。...

    re-reselect:通过更深入的备忘录和缓存管理来增强“重新选择”选择器

    对以下有用: 当使用一个/几个不同的参数顺序调用时,保留选择器的缓存() 将类似的选择器合并为一个在多个组件实例之间与道具共享选择器(请参阅和) 在运行时实例化选择器使用增强reselect import { ...

    cache-helpers:缓存Node.JS的帮助器功能

    cache-helpers是一个Node.JS模块,其中包含几个通用的缓存功能。 编写它是为了提取中的许多常用模式。 cacheHelpers.once :采用一个(可能很昂贵)函数,该函数接受单个回调,并使用可选的error参数和data参数调用...

    手机上的实时语音采集类封装

    该类主要有以下几个函数: void FnWaveInit(HWND hWnd); 用于语音设备初始化,参数为当前窗口句柄 void FnAudioIn(UINT wParam,LONG lParam); 录音消息回调函数,用于接收系统缓存中的语音数据 void ...

    vue单页缓存方案分析及实现

    不同参数展示不同view,这就有点坑了,所以需要结合自己要实现的功能,适当改造keep-alive,为了实现每次前进都能刷新,返回走缓存还能自动定位的功能,文章陆续从以下几个方面展开讲:两套技术方案可选,最后定的...

    三菱PLC QD77MS QD77MS16定位模块视频 编程讲解教程+使用手册+程序样例.zip

    本套视频14集 总大小约1个G 教程视频约3个多小时 整体包含 视频+程序+手册 全套14类目如下 第1集 QD77介绍 第2集 参数介绍 第3集 QD77内部缓存器参数 第4集 QD77ms视频教程 MS2 ms4 MS16的JOG及原点程序讲解 第5集 ...

    wap测试的几个注意点

    wap测试的几个注意点 软件测试 1.手机支持cookies的问题,一般手机浏览器都会自带cookies的情况,且由于wap网络的特殊性,传递时需要有用户id等隐私的参数。涉及到个人安全问题,所以测试时需要特别注意cookies...

Global site tag (gtag.js) - Google Analytics