http的一些事
查找资料将http中缓存相关的知识记录下
一般来说:Last-Modifed和Expires是一对,ETag和Cache-Control是一对
Last-Modified
- Client端跟Server端要一个资源,Server回应HTTP 200 OK,并打下一个Last-Modified日期。
- 当客户端再次要求同一个资源时,会先去检查自己的Cache里面有没有相同的资料,有的话,会检查是不是过期了(Expires or Cache-Control)。
- 没有过期的话:取出自己的资源,停止对服务器发送请求,流程结束。
- 如果已经过期,或者是根本就找不到与过期有关的标签,那么就对服务器丟出If-Modified-Since标签,标头后面的日期当然是复制之前被服务器端指定的日期了。
- 服务器端收到If-Modified-Since的日期,就可以拿來判断是否要重新丟或者拒绝丟新的资源,如果拒绝丢的话,就拋出HTTP 304 Not Modified,如果重新丟的話,就丟吧。
- Client端如果收到HTTP 304,就会乖乖的把Cache拿出來继续用。
ETag
- Client端跟Server端要一个资源,Server回应HTTP 200 OK,并打下一个ETag雜湊。(雜湊的產生方式由程式設計師自己制定,這邊沒有太多的規範。)
- 当客戶端再次要求同一个资源时,会先去检查自己的Cache里面有没有相同的资料,有的话,会检查是不是过期了(Expires or Cache-Control)。
- 沒有过期的话:取出自己的资源,停止对服务器发送请求,流程结束。
- 如果已经过期,或者是根本就找不到与过期有关的标签,那么就对服务器丟出If-None-Match标头,标头后面的编码当然是复制之前被服务器端指定的编码了。
- 伺服器端收到If-None-Match的雜湊,就可以拿來判斷是否要重新丟或者拒絕丟新的資源,如果拒绝丢的话,就拋出HTTP 304 Not Modified,如果重新丟的话,就丟吧。
- 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的一些事的更多相关文章
- 【腾讯Bugly干货分享】H5 视频直播那些事
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a42ee6503dfcb22007ede8 Dev Club 是一个交流移动 ...
- CSharpGL(31)[译]OpenGL渲染管道那些事
CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...
- TODO:字节的那点事Go篇
TODO:字节的那点事Go篇 (本文go version go1.7.3 darwin/amd64) 在Golang中string底层是由byte数组组成的. fmt.Println(len(&quo ...
- Microsoft Visual Studio 2013 — Project搭载IIS配置的那些事
前段时间在改Bug打开一个project时,发生了一件奇怪的事,好好的一直不能加载solution底下的这个project,错误如下图所示:大致的意思就是这个project的web server被配置 ...
- OpenNLP:驾驭文本,分词那些事
OpenNLP:驾驭文本,分词那些事 作者 白宁超 2016年3月27日19:55:03 摘要:字符串.字符数组以及其他文本表示的处理库构成大部分文本处理程序的基础.大部分语言都包括基本的处理库,这也 ...
- HTTPS那些事(一)HTTPS原理
转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...
- 做一个 App 前需要考虑的几件事
做一个 App 前需要考虑的几件事 来源:limboy的博客 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...
- Ctrl-A全选这点事(C#,WinForm)
所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改 ...
- 使用Bandwagon的VPS第一件事《FQ》
说点闲话:昨天的长靴子到了,哎呀,今天那个高兴,踩着我的8厘米的过膝靴就出门上专业外语去了,扎了个麻花辫子,那个心情好哟,搞得我都不想继续学习linux平台上的C语言了,好想逛街----秀秀我的鞋子, ...
- 【转载】在IT界取得成功应该知道的10件事
在IT界取得成功应该知道的10件事 2011-08-11 13:31:30 分类: 项目管理 导读:前面大多数文章都是Jack Wallen写的,这是他的新作,看来要成为NB程序员还要不停的自我总结 ...
随机推荐
- PHP缓存技术
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【Java EE 学习 49 上】【Spring学习第一天】【基本配置】
一.HelloWorld 需要的jar文件(以2.5.5为例):spring.jar,common-logging.jar 1.新建类com.kdyzm.spring.helloworld.Hello ...
- [Unity3D]NGUI用Sprite动画和屏幕自适应做游戏开始场景
我们在玩任何一款手游产品时,都是先上来个logo界面,游戏欢迎界面等,这就意味着我们要做一款游戏需要多个场景,场景之间来回切换实现游戏逻辑,unity也不例外,所以从本篇开始将会介绍如何搭建多个场景, ...
- [leetcode] 题型整理之查找
1. 普通的二分法查找查找等于target的数字 2. 还可以查找小于target的数字中最小的数字和大于target的数字中最大的数字 由于新的查找结果总是比旧的查找结果更接近于target,因此只 ...
- python excel操作
python操作excel表格(xlrd/xlwt)转载:http://www.cnblogs.com/zhoujie/p/python18.html 最近遇到一个情景,就是定期生成并发送服务器使 ...
- 窗体showModal
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- js添加var和不加var区别
var 声明的变量,作用域是当前 function 没有声明的变量,直接赋值的话, 会自动创建变量 但作用域是全局的. //----------------- function doSth() { a ...
- RUDP之一 —— UDP VS TCP
原文链接 原文:http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/ 介绍 大家好,我是Glenn Fiedler, ...
- zeppelin-0.6.0安装配置
从http://zeppelin.apache.org/download.html 下载 zeppelin-0.6.0-bin-all.tgz 解压 修改zeppelin-site.xml,配置端口 ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...