来介绍一下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. OVM-V1.2 版发布,新增实时监控、支持一键升级

    OVM是国内首款.完全免费.企业级--混合虚拟化管理平台,OVM是从中小企业目前的困境得到启发,完全基于国内企业特点开发,更多的关注国内中小企业用户的产品需求. OVM-V1.2 该版本功能变动如下: ...

  2. 编程技术●Python

    <Python语言入门> 2015-01-16 14:13 ★ 虽然书名叫入门.序里也写了说完全没有编程经验的都可以用这本书来学习入门.不过好像不太适合哦.书很好,内容也挺全面细致的.太好 ...

  3. Allegro建立引脚封装概念名词梳理

    首先感谢于博士的60讲的Cadence教学视频,老师讲的还是很有耐心,很细致,谢谢! 目前还只是看到建立PCB封装这一块,正好手头上有个案子在做,边做边学的进度还是要好很多.以前的工作对原理图这一块的 ...

  4. hdu 2073

    ps:感觉纯数学题.....我的思路就是找规律,发现dp(x+y) 就是 (0,x+y)的值,然后再加上x*根号2.就是他的距离.然后两个距离相减的绝对值就是两个点之间的距离了. 代码: #inclu ...

  5. datawindow 创建操作报表。

    最近制作做了几个简单的报表,写下主要的代码.以便各位参考. public void FillDW(DataTable dtbResult) { try { DataRow dtFr; ; , j = ...

  6. ashx

    一般处理程序(HttpHandler)是·NET众多web组件的一种,ashx是其扩展名.一个httpHandler接受并处理一个http请求,类比于Java中的servlet.类比于在Java中需要 ...

  7. iOS-UILabel自适应高、宽

    UILabel自适应高 UILabel自适应宽

  8. java.lang.ClassNotFoundException: Didn't find class "*****(转载)

    很多人出现了java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{*****Activity}: java. ...

  9. HDU 1372 Knight Moves (bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Othe ...

  10. Flash Builder如何自定义工作目录

    熟悉了myeclipse可以自定义目录的设置,今天在使用flash builder 时,当导入一个工程到现有项目空间 选择根目录,点击浏览的时候出现的目录是C:\Users\Administrator ...