查找资料将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. PAT A 1119. Pre- and Post-order Traversals (30)【二叉树遍历】

    No.1119 题目:由前序后序二叉树序列,推中序,判断是否唯一后输出一组中序序列 思路:前序从前向后找,后序从后向前找,观察正反样例可知,前后序树不唯一在于单一子树是否为左右子树. 判断特征:通过查 ...

  2. android用户界面之Gallery3D学习资料汇总

    一.Gallery之根蒂根基教程1.Android Gallery与衍生BaseAdapter容器 http://www.apkbus.com/android-6249-1-1.html 2.Andr ...

  3. ASP.Net 在Update Panel局部刷新后 重新绑定JS方法

    我们知道Asp.Net中的Update Panel可以完成页面的局部刷新(实质上是Ajax),但是局部刷新完后,此区域的控件上所绑定的JS方法就会失效,因为我们用如下方法来重新绑定. var prm ...

  4. BZOJ3752 : Hack

    折半爆搜,首先爆搜出所有长度不超过$4$的串. 对于每个询问,首先暴力枚举所有长度不超过$4$的串,以及前$4$位相同时后面的串. 然后枚举前$4$位,以及后面的串长,那么后面的hash值唯一,可以双 ...

  5. MySQL导出数据

    1.MySQL导出数据库 只导出数据库结构:选中数据库-->右键—>数据传输—>高级—>取消勾选记录选项.

  6. WebCrawler

    WebCrawler WebCrawler is a metasearch engine that blends the top search results from Google Search a ...

  7. jquery ui dialog autofocus 去掉默认第一个元素获取焦点

    经常在dialog窗口中第一个元素为日期控件时,打开窗口则会自动显示日期下拉框. 解决办法:在dialog的open事件中,设置父对象获得焦点. p1_dialog_seniorSearch.dial ...

  8. 随鼠标轮动翻动层————jquery小练习

    闲来无事在网站上看见一个网页制作的不错,就仿照做来看看.特此记录下来. 亮点:随鼠标上下滚动,展示页面随之不同,翻动效果. 功能点:鼠标向上,向下判断事件. css 代码 html { overflo ...

  9. shell 套用expect

    先用if 判断expect有没有安装 没有就yum install expect #!/bin/bash passwd='123456' /usr/bin/expect <<-EOF se ...

  10. stl文件格式

    http://wenku.baidu.com/view/a3ab7a26ee06eff9aef8077b.html [每个三角形面片的定义包括三角形各个定点的三维坐标及三角形面片的法矢量[三角形的法线 ...