查找资料将http中缓存相关的知识记录下

一般来说:Last-Modifed和Expires是一对,ETag和Cache-Control是一对

Last-Modified

  1. Client端跟Server端要一个资源,Server回应HTTP 200 OK,并打下一个Last-Modified日期。
  2. 当客户端再次要求同一个资源时,会先去检查自己的Cache里面有没有相同的资料,有的话,会检查是不是过期了(Expires or Cache-Control)。
  3. 没有过期的话:取出自己的资源,停止对服务器发送请求,流程结束。
  4. 如果已经过期,或者是根本就找不到与过期有关的标签,那么就对服务器丟出If-Modified-Since标签,标头后面的日期当然是复制之前被服务器端指定的日期了。
  5. 服务器端收到If-Modified-Since的日期,就可以拿來判断是否要重新丟或者拒绝丟新的资源,如果拒绝丢的话,就拋出HTTP 304 Not Modified,如果重新丟的話,就丟吧。
  6. Client端如果收到HTTP 304,就会乖乖的把Cache拿出來继续用。

ETag

  1. Client端跟Server端要一个资源,Server回应HTTP 200 OK,并打下一个ETag雜湊。(雜湊的產生方式由程式設計師自己制定,這邊沒有太多的規範。)
  2. 当客戶端再次要求同一个资源时,会先去检查自己的Cache里面有没有相同的资料,有的话,会检查是不是过期了(Expires or Cache-Control)。
  3. 沒有过期的话:取出自己的资源,停止对服务器发送请求,流程结束。
  4. 如果已经过期,或者是根本就找不到与过期有关的标签,那么就对服务器丟出If-None-Match标头,标头后面的编码当然是复制之前被服务器端指定的编码了。
  5. 伺服器端收到If-None-Match的雜湊,就可以拿來判斷是否要重新丟或者拒絕丟新的資源,如果拒绝丢的话,就拋出HTTP 304 Not Modified,如果重新丟的话,就丟吧。
  6. Client端如果收到HTTP 304,就会乖乖的把Cache拿出來继续用。

由上面可以得知,Last-Modified、ETag这两种机制的运作模式几乎是一样的

再论Expires与Cache-Control

Expires是HTTP 1.0的产物,而Cache-Control是HTTP 1.1的产物,这两个都是在描述资源的过期时间点,但是为何要创造出两种的标头呢?原因在于Expires是从服务器端打下來的时间,这一点是比较有争议的,尤其当Client端的時間进行比较大的变动时(例如出国换时区、电脑的时间跳掉),整個快取得的机制就毀掉了。因此后来Cache-Control把机制改成计算制度(秒数),也就是说拿出Client端时间來相加此秒数,就等于是过期时间点。※注:事实上仔细一想,如果你的Client时间真的错误了,那么用Cache-Control依然无法解决问题。

这边会再讨论出一个问题点,那就是ETag是以编码为基础的,在取得不到日期的情況下,如何拿来与Cache-Control的秒速来相加,并计算出过期时间呢?这一点我找了许多的文章,目前还没有一定的解释。我推测有可能是拿标头的Date或Last-Modifed來运算,也有可能浏览器自己制定了一个计时的功能,或者是拿本地端的档案存档时间来算,这都有可能。所以我的作法是怎就算你打出ETag,还是会再帮忙打出一次Last-Modifed來进行辅助,以利计算过期时间。因此Google這篇使用瀏覽器快取功能的文章中,有关于「同時指定Last-Modified和ETag,都是多余的行为。」這句话值得玩味

此外值得一提的是,在现代的浏览器中,如果你设定了Cache-Control而没有设定Expires,則Cache-Control會盖过Expires的设定。另外也要注意的是,RFC2616规范,Cache的设定不可以超過一年。

总结

如果你把这篇文章从头看到尾,你就会发现使用Last-Modifed与Cache-Control這两个标头就好,其他都有如浮云般的无意义,这个再次的证明,革新不代表一定就是好事。当然,也不能说ETag就没有存在的意义,想想看,如果你的服务器群共用某一个资源(例如你公司的Logo),但是基于某些因素你没有办法让这些服务器群的时间同步,那么选用ETag的机制来对此图示进行编码,会是一个比较好的做法。

补充

若你只有使用Last-Modifed而没有使用Expires or Cache-Control的缺点是,在强制重新整理网页時,你看不出任何效果。但是当你在同一个URL下,直接在网址列上再按下一次ENTER,你就会发现,没有使用到Expires or Cache-Control的资源,会强制再去跟服务器要一次GET,只不過会得到304,而这个通讯根本是非必要的。

http的一些事的更多相关文章

  1. 【腾讯Bugly干货分享】H5 视频直播那些事

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a42ee6503dfcb22007ede8 Dev Club 是一个交流移动 ...

  2. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

  3. TODO:字节的那点事Go篇

    TODO:字节的那点事Go篇 (本文go version go1.7.3 darwin/amd64) 在Golang中string底层是由byte数组组成的. fmt.Println(len(&quo ...

  4. Microsoft Visual Studio 2013 — Project搭载IIS配置的那些事

    前段时间在改Bug打开一个project时,发生了一件奇怪的事,好好的一直不能加载solution底下的这个project,错误如下图所示:大致的意思就是这个project的web server被配置 ...

  5. OpenNLP:驾驭文本,分词那些事

    OpenNLP:驾驭文本,分词那些事 作者 白宁超 2016年3月27日19:55:03 摘要:字符串.字符数组以及其他文本表示的处理库构成大部分文本处理程序的基础.大部分语言都包括基本的处理库,这也 ...

  6. HTTPS那些事(一)HTTPS原理

    转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...

  7. 做一个 App 前需要考虑的几件事

    做一个 App 前需要考虑的几件事  来源:limboy的博客   随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...

  8. Ctrl-A全选这点事(C#,WinForm)

    所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改 ...

  9. 使用Bandwagon的VPS第一件事《FQ》

    说点闲话:昨天的长靴子到了,哎呀,今天那个高兴,踩着我的8厘米的过膝靴就出门上专业外语去了,扎了个麻花辫子,那个心情好哟,搞得我都不想继续学习linux平台上的C语言了,好想逛街----秀秀我的鞋子, ...

  10. 【转载】在IT界取得成功应该知道的10件事

     在IT界取得成功应该知道的10件事 2011-08-11 13:31:30 分类: 项目管理 导读:前面大多数文章都是Jack Wallen写的,这是他的新作,看来要成为NB程序员还要不停的自我总结 ...

随机推荐

  1. Tensorflow二分类处理dense或者sparse(文本分类)的输入数据

    这里做了一些小的修改,感谢谷歌rd的帮助,使得能够统一处理dense的数据,或者类似文本分类这样sparse的输入数据.后续会做进一步学习优化,比如如何多线程处理. 具体如何处理sparse 主要是使 ...

  2. Power BI for Office 365(二)Power Query

    在上一篇中我们看到了Power BI在移动端的支持,从这一篇起降依次介绍Power BI中的各个功能组件,此篇讲通过一个故事来介绍如何在Power Query中获取并且组织数据. 在这个系列中,我们将 ...

  3. Linux使用ssh-keygen实现SSH无密码登录

    一.原理简介: 1.SSH公钥认证的基本原理:     SSH是一个专为远程登录会话和其他网络服务提供安全性的协议.默认状态下SSH链接是需要密码认证的,可以通过添加系统认证(即公钥-私钥)的修改,修 ...

  4. Redis到底该如何利用(二)?

    上一篇文章里我简述了使用Keys作为Redis搜索的方式,确实感受到了社区的力量,写文章好处多.首先谢谢各位前辈的指导,我知道了拿Redis作为搜索是个错误的方向.本来这篇文章我觉得确实没必要发了,但 ...

  5. 图像缩放_OpenCv

    图像缩放是一种比较简单的图像处理操作,这里给出opencv中的代码, opencv的版本C语言接口 int resize_c() { const char *pstrImageName = " ...

  6. Intel VT入门

    前言     传说中的VT貌似很神秘的样子,关于VT入门的资料又很少,于是研究了一番 由于资源有限,自身水平亦有限,并且是闭门造车之作,如有错误的地方请指正,不胜感激! 关于VT可以先参考海风月影写的 ...

  7. .NET 农码一生

    农码一生博文索引 http://www.cnblogs.com/zhaopei/p/Indexes.html 那些年搞不懂的术语.概念:协变.逆变.不变体 http://www.cnblogs.com ...

  8. 2016 Multi-University Training Contest 2

    8/13 2016 Multi-University Training Contest 2官方题解 数学 A Acperience(CYD)题意: 给定一个向量,求他减去一个  α(>=0)乘以 ...

  9. Sass和compass 安装 和配合grunt实时显示 [Sass和compass学习笔记]

    demo 下载http://vdisk.weibo.com/s/DOlfkrAWjkF/1401192855 为什么要学习Sass和compass ?提高站独立和代码产品化的绝密武器,尤其是程序化cs ...

  10. Unity3d与Android交互

    先看下效果 你一定会说,然并卵! 没错,这里只是一个最简单的例子,unity与android activity 互相传参数. 玩过手游的都知道,在你要为你心爱的游戏角色准备花钱买钻石,点击购买的时候, ...