来介绍一下http中的这几个概念

先来介绍一下Etag:

看看百度来的简介:HTTP协议规格说明定义ETag为“被请求变量的实体值”。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。ETag(EntityTags)是URL的tag,用来标示URL对象是否改变,这样可利用客户端的缓存。由服务器首先产生ETag,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。服务器使用它来判断页面是否已经被修改,如果未修改返回304,而不必重新传输整个对象。ETag由服务器端生成,客户端通过If-Match或者说If-None-Match判断请求来验证资源是否修改。

所以提到这就不得不来说说另一个概念Last-Modified,表示的是服务器上此文件最后一次修改此的时间。浏览器会向服务器传送If-Modified-Since报头,询问该时间之后文件是否有被修改过,如果未修改过那么好,直接就去取缓存,不用再次去访问服务器获得此资源。听起来是不是和上述的Etag差别不太大,没错,Etag的出现就是要解决Last-Modified不能解决的一些问题,算是Last-Modified的升级版。来看看Last-Modified不能解决的下列问题:

1、周期性更改的文件且内容并不改变(仅仅改变的修改时间)。

2、有些文件修改极其频繁,也许1秒内修改了很多次,If-Modified-Since能检查到的最小单位是秒级的,所以这种修改无法判断

3、不能精确得到文件的最后修改时间

HTTP1.1之后就出现了升级版的Etag来解决上述Last-Modified不能解决的问题。大概了解了之后我们来看看实例。

比如当我用chrome打开百度首页时。可以按f12,我们可以用来查看页面信息,点击network选项,我们可以看到被请求的各资源。打开百度首页,来看看百度logo的那张图片。

第一次请求时,可以看到如下信息

可以看到返回的是200 ok字样,说明此图片被成功的从服务器上取到。并且可以看到返回了一个Etag信息  ETag:"1ec5-502264e2ae4c0"

当第二次请求百度页面时,再去查看这两张图片的信息可以看到状态码为304。并且Request-headers返回了 If-None-Match:"1ec5-502264e2ae4c0",与Etag里的数据相匹配。

通过匹配信息,返回304,让客户端继续使用本地缓存,不用再去请求服务器。

下面来说一下Expires

表示存在时间,指定了在浏览器上缓冲存储的页距过期还有多少时间。如果用户在某个页过期之前再次访问,就会显示缓存中的版本。等同Cache-control中的max-age的效果。但是如果同时存在,则被Cache-Control的max-age覆盖。若把其值设置为0,则表示页面立即过期。并且若此属性在页面当中被设置了多次,则取其最小值。
同样用上面的例子

这个使用时唯一要注意的一点是,采用的时间必须是 GMT也就是格林威治标准时间。 第三个来呢来谈谈Cache-control
max-age=[秒] — 执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间,[秒]是一个数字,单位是秒:从请求时间 开始到过期时间之间的秒数。
s-maxage=[秒] — 类似于max-age属性,除了他应用于共享(如:代理服务器)缓存
public — 标记认证内容也可以被缓存,一般来说: 经过HTTP认证才能访问的内容,输出是自动不可以缓存的;
no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据 的应用(不惜牺牲使用缓存的所有好处);
no-store — 强制缓存在任何情况下都不要保留任何副本
must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的,HTTP允许缓存在某些特定情况下返回过期数据,指定了这个属性,你高速缓存,你希望严格的遵循你的规则。
proxy-revalidate — 和 must-revalidate类似,除了他只对缓存代理服务器起作用(关于catch-control上面这一段源自于网上一篇优秀的博客,现在链接已经找不到了实在不好意思。。)
还有另一篇描述很详细的文章(http://www.cnblogs.com/cuixiping/archive/2008/05/04/1181056.html)以前是通过这些优秀博客学习的,现在分享出来,与大家共同学习。
最后还有一个pragma。应该是与cache-control相同。但是是为了兼容http 1.0 的。比如Pragma: no-cache兼容http 1.0 ,Cache-Control: no-cache是http 1.1提供的。这样就保证了不支持http 1.1的浏览器可以正常使用缓存功能。
嗯,大概差不多就酱紫了。。

Etag,Expires与Cache-control的更多相关文章

  1. 网站 cache control 最佳实践

    推荐阅读: 2020年软件开发趋势 高并发案例 - 库存超发问题 负载均衡的分类及算法 异地多活架构 Postman 的替代品来了 有时,当第二次访问网站时,看起来比较怪,样式不正常. 通常,是因为 ...

  2. [转]ASP.NET Core: Static Files cache control using HTTP Headers

    本文转自:https://www.ryadel.com/en/asp-net-core-static-files-cache-control-using-http-headers/ Every sea ...

  3. Symfony2学习笔记之HTTP Cache

    富web应用程序的本质意味着它们的动态.无论你的应用程序多么有效率,每个请求比起静态文件来说总会存在很多的耗费.对于大多数web程序来说,这没什么. Symfony2非常的轻快,无论你做些严重超载的请 ...

  4. http缓存提高性能

    秋招也算是正式结束了,现在整理一下笔记,当作巩固一下知识,也希望这个对大家有帮助 http 缓存 和 cdn 缓存可以说是面试必问的问题,竟然是必问的问题,那就总结全面一点- http缓存机制 缓存分 ...

  5. HTTP请求中的缓存(cache)机制

    http://www.chaorenmao.com/blog/?p=79 流程 当资源第一次被访问的时候,HTTP头部如下 (Request-Line)  GET /a.html HTTP/1.1Ho ...

  6. 前端性能优化:Add Expires headers

    前端性能优化:Add Expires headers Expires headers 是什么? Expires headers:直接翻译是过期头.Expires headers 告诉浏览器是否应该从服 ...

  7. Expires和Cache-Control

    本文原链接:https://blog.csdn.net/zhouziyu2011/article/details/71312452 浅谈前端性能优化(一)——Expires和Cache-Control ...

  8. [INet] 借助 HTTP Cache 加速应用响应

    背景: GET 访问一个应用的时候,内容一般都不会时刻在变,如何让下一个人请求时极速获取响应过的内容,并且在内容发生变更时能够识别出来. 在应用层做 Cache 是一种方法,但是依旧要响应整个 Bod ...

  9. Last-Modified,Etag,Expire区别

    Last-Modified 是什么 Last-Modified 是 HttpHeader 中的资源的最后修改时间,如果带有 Last-Modified ,下一次发送 Http 请求时,将会发生带 If ...

  10. Method, apparatus, and system for speculative abort control mechanisms

    An apparatus and method is described herein for providing robust speculative code section abort cont ...

随机推荐

  1. 【lattice软核】MICO8流程

    The LatticeMico System software is composed of three bundled applications:  Mico System Builder (MS ...

  2. CSS篇章

    页面的组成:页面=数据(后台技术jsp|asp|.net|php|python)+Html(显示)+CSS(样式)+js(动效) CSS:层叠样式表        特点:①CSS和HTML分离    ...

  3. Nice Sequence_线段树***

    Description Let us consider the sequence a1, a2,..., an of non-negative integer numbers. Denote as c ...

  4. FatMouse' Trade_贪心

    Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...

  5. .NET 强引用和弱引用

    一:什么是弱引用 了解弱引用之前,先了解一下什么是强引用 例如 : Object obj=new Object();     就是一个强引用,内存分配一份空间给用以存储Object数据,这块内存有一个 ...

  6. windows dir改成ls

    习惯了linux下的ls命令,windows的dir用的很不习惯,又不想装cygwin, bash,就想把dir重命名为ls,发现dos下有个命令doskey可以完成该功能.在命令提示符下敲: > ...

  7. oracle中的装换函数

    日期装换成字符的函数:TO_CHAR(date[,fmt[,params]]) 默认格式:DD-MON-RR 参数说明: date:将要装换的日期 fmt:装换的格式 params:日期的语言(可以不 ...

  8. ppDelegate的相关介绍

    //  AppDelegate的相关介绍//  IOS笔记 //@interface AppDelegate : UIResponder <UIApplicationDelegate>// ...

  9. PlayerLog.lua --玩家登录通告

    print(">>Script: Player Log Message.") --CLASS 职业 --战士 --圣骑士 --猎人 --盗贼 --牧师 --死亡骑士 - ...

  10. django 过滤器 、日期格式化参数

    http://blog.csdn.net/xyp84/article/details/7945094 django1.4 html页面从数据库中读出DateTimeField字段时,显示的时间格式和数 ...