`
真爱无敌
  • 浏览: 23844 次
  • 性别: 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
分享到:
评论

相关推荐

    asp.net缓存(页面输出缓存和应用程序缓存)

    在这个例子中,`Insert`方法用于将数据存入缓存,`MyKey`是唯一的标识符,`null`表示没有依赖项,`Cache.NoAbsoluteExpiration`表示无绝对过期时间,`new TimeSpan(0, 5, 0)`表示相对过期时间,即5分钟后过期。...

    HTTP+JS+浏览器缓存技术

    浏览器请求流程可以分为以下几个步骤: 1. 浏览器第一次请求流程图: 浏览器发送请求 → 服务器响应 → 浏览器缓存 → 浏览器渲染 2. 浏览器再次请求时: 浏览器发送请求 → 浏览器缓存 → 浏览器渲染(如果缓存...

    java map 实现缓存技术

    使用Java Map实现缓存,我们需要考虑以下几个关键点: 1. **缓存初始化**:创建Map实例,可以是HashMap、ConcurrentHashMap或其他适合并发访问的实现,根据实际需求选择。 2. **缓存加载**:当请求的数据不在缓存...

    地图缓存的实现

    实现地图缓存的过程大致分为以下几个步骤: 1. **设置缓存参数**:首先,你需要定义地图缓存的参数,这包括缓存的分辨率级别(决定地图的放大和缩小级别)、切片大小(地图每个图像块的尺寸)以及缓存的覆盖范围。 ...

    http缓存知识梳理

    为了充分利用浏览器缓存,开发者需要对响应头中的几个关键字段进行设置: 1. Expires:该字段指定资源过期的具体时间,过期后浏览器需要重新从服务器请求资源。 2. Cache-Control:通过设置不同的指令来控制资源的...

    Android app缓存清理实现

    Android app缓存清理通常包括以下几个关键步骤: 1. **确定缓存路径**:Android提供了多种类型的缓存,如内部存储的`getCacheDir()`和外部存储的`getExternalCacheDir()`。你需要确定你的应用使用的缓存目录,然后...

    PHP 缓存类和apc缓存类

    除了以上三个基本操作外,该类还提供了其他几个有用的方法: - **`clear()`**:清除所有缓存。 - **`lock($key)`** 和 **`unlock($key)`**:锁定和解锁指定的缓存项。锁定可以防止缓存项在一段时间内被修改。 - **`...

    Unity点缓存识别插件.rar

    在3D动画制作中,点缓存(Point Cache)技术是一种常见的动画数据存储和重用方式,尤其在与3DS MAX等专业3D建模软件协同工作时。点缓存允许我们将复杂的模拟动画,如布料、流体或刚体动力学,从模拟工具导出到游戏...

    linq 的全数据库缓存

    3. **缓存操作的封装**:通过将缓存的获取、插入、移除等操作封装在一个或几个方法中,提高了代码的可维护性。例如,通过`eee.Insert(CacheName, ...)`进行数据缓存。 4. **异常处理与错误检查**:虽然代码中没有...

    hibernate5.1二级缓存包

    配置二级缓存主要包括以下几个步骤: 1. **引入依赖**:首先需要在项目的 Maven 或者 Gradle 构建文件中添加相应的二级缓存库依赖,如 Ehcache 或 Infinispan。 2. **配置**:在 Hibernate 的配置文件(如 ...

    随机缓存探究系统

    在压缩包的文件名列表中,我们可以看到以下几个文件: 1. "test.png":可能是用于展示缓存系统效果的图表或数据可视化。 2. "learnGNUplot.py":这可能是一个使用GNUPlot库的Python脚本,用于绘制和分析数据图表。 3...

    基于ASP.NET缓存与分页策略优化Web数据查询性能

    采用此优化方案后,Web应用的性能得到了显著提升,主要体现在以下几个方面: 1. **减少数据库访问次数**:通过缓存数据,只有在数据未被缓存或缓存失效的情况下才需要访问数据库,从而显著降低了数据库的负载。 2...

    jfinal缓存demo 及jar包

    在实际的`jfinal缓存demo`中,可能会包含以下几个步骤: 1. **引入依赖**:在项目构建文件(如Maven的pom.xml或Gradle的build.gradle)中添加Ehcache的依赖,并确保JFinal的版本与Ehcache兼容。 2. **配置Ehcache*...

    SC超级缓存设置和工具.rar

    在“SC超级缓存设置教程”中,通常会涵盖以下几个关键点: 1. **安装与配置**:安装SC超级缓存软件或组件,然后进行必要的配置,包括设定缓存大小、缓存策略(如写后读策略、预读策略等)、缓存淘汰规则等。 2. **...

    CreateOutputCachedItemKey 缓存key的创建

    缓存键的创建过程通常包含了以下几个步骤: 1. 确定HTTP请求类型,并在键前添加相应的前缀(a1代表POST,a2代表GET)。 2. 追加请求路径,确保不同路径的请求有不同的缓存键。 3. 如果存在缓存变体(CachedVary),...

    jsp缓存方式

    在JSP页面中,可以通过以下几种方式来控制缓存时间: 1. **使用JSP指令**:在JSP页面顶部添加`&lt;%@ page %&gt;`指令,设置`cache`属性值来控制页面的缓存时间。例如: ```jsp ``` 上述代码表示禁止缓存该JSP页面。...

    浏览器缓存目录设置

    2. **搜索缓存设置项**:在配置页面中搜索`cache4`或`CacheDirectory4`,这两个选项分别对应HTTP缓存和SSL缓存的存储位置。 3. **修改缓存路径**:选中对应的设置项后,可以在其右侧看到当前的缓存目录路径,点击...

    iBATIS缓存介绍

    在配置时,需要关注操作系统缓存相关的参数设置,以确保缓存性能达到最佳状态。 #### 四、参考资料 文档中未给出具体的参考资料信息,但建议参考iBATIS官方文档以及其他可靠的在线资源来获取更多信息和支持。

    asp.net缓存sql数据库

    ASP.NET缓存是微软开发的ASP.NET框架中的一个重要特性,用于提高Web应用程序的性能和响应速度。当数据在一段时间内不会发生变化或者变化频率极低时,利用缓存机制可以避免频繁地从SQL数据库中检索数据,从而降低...

    MySQL8.0内存相关参数总结

    下面将详细解释几个重要的内存参数及其作用。 1. **innodb_buffer_pool_size**: 这是InnoDB存储引擎的核心参数,用于缓存表数据和索引,减少了磁盘I/O操作。它占用的内存大小直接影响到InnoDB的性能。一般来说,...

Global site tag (gtag.js) - Google Analytics