Http的Cache机制总共有4个组成部分:
Cache-Control: max-age=N(seconds)
Last-Modified: Date, If-Modified-Since: Date
Etag: "xxxx"
Expires: Date
它们都存在于Request或者Response的Header中
按照作用来分可以分为浏览器端和服务器端。
浏览器端:
注:刷新都会无视浏览器端的Cache
Cache-Control: max-age=N(seconds)
Expires: Date
Cache-Control的max-age优先级高于Expires(至少对于Apache是这样的),即如果定义了Cache-Control: max-age,则完全不需要加上Expries,因为根本没用。例如:你在浏览A页面时,A页面加载了一个名为B的JS文件,该JS文件的Response Header中有Cache-Control: max-age=60,如果你再访问任何其他用到B文件的页面时,60秒内浏览器完全不会向服务器发送请求,直接使用Cache中的内容。60秒以后,Cache失效。想每一次都发送请求,则max-age设为0
Cache-Control在Apache中的设置为
Header set Cache-Control "max-age: 60"
Expires是相同的功能,不过参数是个绝对的日期,不是一个相对的值
Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT"
如果使用mod_expires.so也可以根据相对值计算出绝对值
服务器端:
Last-Modified: Date, If-Modified-Since: Date
ETag
继续刚才上面的例子,当max-age超过以后,浏览器会向服务器端发送请求。在B文件上一次的Response Header中会带有Last-Modified: Date,这时新请求的Header中会有If-Modified-Since: Date。服务器端在收到请求后,将B的最后修改日期和Header中的日期进行对比,如果相同则说明B没有被修改过,返回304 Not Modified,否则返回200和B的内容
如果只设置了Last-Modified而没有设置Cache-Control,则不同浏览器的表现会不同: 1. IE中也许有个默认的非常大的max-age或者压根就是无限,服务器端修改的内容,IE中不会反映出来 2. FF和Webkit请求的比较随机,貌似刚刚变更后请求的会比较频繁,然后逐渐放大请求的间隔,但是服务器端修改了内容,我还没试出来浏览器不更新的...
Etag和Last-Modified也是类似的,只不过检查的不是最后修改的时间,而是被请求内容的Hash
Etag和Last-Modified在Apache中默认都是打开的,关闭的方法是
Header unset Etag
Header unset Last-Modified
综上所述:
对于静态的内容:如果引用静态文件时可以根据文件的修改时间生成动态的文件名,并rewrite到实际的文件,则可以设置max-age: 5184000(2个月,其实可以更长,比如1年),这样的话可以省去大量的http请求。否则的话,只能设置Last-Modified(或者Etag,Etag估计比较耗cpu) + max-age: 0,则每次都会发送请求,并且大多数会得到304 Not Modified
对于变更不频繁的动态内容:可以在response中加上Cache-Control: max-age=0 + Last-Modified(ETag),可以让很多200的请求变成304的请求
分享到:
相关推荐
重置开关,重置标记,这个东西怀疑是内部人外泄出来的。 要么就是有人反编译或跟踪解读程序找到的。总之发现它应该不容易。 试用期重置方法 大致有手工笨法清理 和 全自动脚本清理两种 笨法也可以有两种 一种是在...
基本原理我发现自己编写的代码会一遍又一遍地重复这些操作: 将某种 ID 转换为 Redis 密钥尝试从Redis获取值如果从缓存中丢失,计算该值并将其设置在 Redis 中将结果字符串转换为可用的东西这是执行上述操作的通用...
1. 其中一些重要变化(对HTTP2,SSL支持的改动较多) <1> 不再提供对HTTP BIO,AJP BIO的支持; <2> 重构HTTP upgrade与AJP实现,减少重复; <3> 支持HPACK header encoding与decoding; <4> 增加JSSE的SSL engine,...
标题中的“好用的东西,计算机考试”指的是计算机一级考试的辅助工具,而描述中的“计算机一级考试的好帮手,包括答案和尸体,命中率很高”意味着这个工具提供了考试的答案和可能的试题样本,帮助考生备考,提高通过...
cashe 最基本的用途是通过给它一个函数来创建给定密钥的东西。 var cache = cashe ( function ( key ) { return key + "value" ; } ) ; 您可以按如下方式使用它: cache ( "firstKey" ) ; // calls function, ...
它安装在机箱内,是微机最基本的也是最重要的部件之一。 计算机选购原则包括够用原则和耐用原则。够用原则是指在满足使用的同时要精打细算,节约每一分钱,买一台能满足自己使用要求的电脑即可。耐用原则,是指在...
Apache HTTP Server,通常简称为Apache,是世界上最广泛使用的网络服务器软件之一。这个开源项目由Apache软件基金会维护,它提供了一个跨平台的、稳定的、高性能的HTTP(超文本传输协议)服务环境。Apache 2.2版本是...
标题“tips-tricks:一些有趣的东西可以阅读和学习”暗示了这是一个包含各种实用技巧和窍门的资源集合,旨在帮助我们更好地理解和应用技术。描述中提到,这可能是一个个人的学习仓库,其中包含了作者想要记住但又容易...
存储层次结构理论(Cache、主存、辅存)是提高存储性能的关键,通过缓存技术可以减少CPU访问主存的时间,提高计算效率。 计算机指令系统是CPU能理解和执行的命令集,包括数据处理指令、控制流指令等。指令集架构...
对 CPU 超频爱好者这些东西应该了如指掌,CPU 的外频设置(CPU External Frequency)是超频的关键之一,CPU 的主频(即我们平时所说的 P4 3.0G 等等之内的频率)是由外频和倍频相乘所得的值,比如一颗 3.0G 的 CPU ...
4. **存储系统**:涵盖内存层次结构,从高速缓存(Cache)到主存再到外存,理解它们的工作原理和访问速度差异,以及地址映射和替换策略。 5. **中央处理器(CPU)设计**:包括CPU的时钟周期、流水线技术、超标量...
- `functools`: 提供了一些高级函数,如`partial()`用于固定函数参数,`lru_cache()`实现LRU缓存策略,以及`wraps`装饰器用于函数装饰器。 - `itertools`: 提供了一系列高效且迭代器操作的函数,如`combinations()...
这个从根本上决定了 PHP 性能中很难改变的一些东西:在 C/C++ 等能够在静态编译阶段确定的变量、函数,在 PHP 中需要在动态运行中确定,也就决定了 PHP 中间码不能直接运行而需要运行在 Zend Engine 上。 Hashtable...
它是超薄的,因此基本上只包含必需的东西。 如果您需要全部功能,请尝试: : 它主要针对需要路由和一些附加逻辑的简单应用程序。 对于通过JavaScript调用获取数据JavaScript驱动的应用程序来说,它是一个很好的...
"探索性的东西"这个标题可能暗示我们将深入探讨HTML的一些关键特性、用途以及与之相关的概念。在这个压缩包文件"ExploratoryStuff-master"中,我们可以预期找到一系列关于HTML学习和实践的资源。 首先,让我们深入...
2. 计算机对硬盘的读写是以扇区为基本单位的,扇区是数据存储和磁盘管理的最基本单位。 3. 硬盘上的数据按照其不同的特点和作用大致可分为五部分:主引导扇区、操作系统引导扇区、文件分配表、目录区和数据区。 4. ...
**内存结构**,也称为System Global Area(SGA),占据操作系统内存的60-70%,由共享池(shared pool)、数据库缓冲区(database buffer cache)和重做日志缓冲区(redo log buffer)组成。共享池存储SQL语句和PL/...