查找资料将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. Git版本控制管理学习笔记2--起步

    首先确保系统中已经安装了git,这里使用的linux系统. 一.命令行初步使用: 1.git命令: 列出它的选项和最常用的子命令.标准命令格式中,COMMAND代表的就是下面列出的子命令. [root ...

  2. Ajax请求安全性讨论

    今天我们来讨论一下ajax请求的安全性,我相信各位在系统开发过程中肯定会绞尽脑汁的想怎样可以尽量少的防止伪造ajax请求进行攻击,尤其是开发跟用户交互比较多的互联网系统.那么就请大家来分享讨论一下你在 ...

  3. android中四大组件之间相互通信

    好久没有写有关android有关的博客了,今天主要来谈一谈android中四大组件.首先,接触android的人,都应该知道android中有四大组件,activity,service,broadca ...

  4. sar命令的使用

    http://blog.csdn.net/wudiyi815/article/details/7494847 http://blog.csdn.net/colin_liu2009/article/de ...

  5. Java -> 把Excel表格中的数据写入数据库与从数据库中读出到本地 (未完善)

    写入:没有关闭流,容错并不完善. private void insertFile(HttpServletRequest request, HttpServletResponse response) t ...

  6. HDU4609 & FFT

    关于这道题请移步kuangbin爷的blog:http://www.cnblogs.com/kuangbin/archive/2013/07/24/3210565.html 感觉我一辈子也不能写出这么 ...

  7. HDU 1166 敌兵布阵 (树状数组)

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    ...

  8. mysql timeout connection

    由于使用阿里云服务器,使用mysql 每当周一的时候客户端首次连,总是报timeout connection 的错误 ,尝试了几个方法没有实际效果. 1.用网上说的URl上缀上autoReconnec ...

  9. 如何在Android中实现全屏,去掉标题栏效果

    在进行Android UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置.   1.在xml文件中进行配置   在项目的清单文件A ...

  10. secureCRT中文乱码问题

    #vim /etc/sysconfig/i18n将LANG="EN_US.UTF-8"改成LANG="zh_CN.UTF-8"重新登录后生效#local查看是否 ...