- 浏览: 418198 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
xiaomuxingren:
你好,请问update-alternatives --inst ...
JDK8安装及jenkins安装 -
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
HTML5 WebSocket -
晨曦的朝阳:
刚好有需求,学习一下!
MySql主从配置 -
mfkvfn:
这是恶意的商业竞争呀
解决 android 微信5.0及后续版本无法打开电话号码的问题 -
fwyhf:
require('./monitor/module_liste ...
NodeJS Server 进程自动重启
同时参考的是W3C RFC2616规范中的
HTTP1.1/HEADER说明
利用 HTTP Cache来优化网站
缓存控制头 Cache-Control
Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为。这些指令 通常覆盖默认缓存算法。缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。
cache-control 定义是:Cache-Control = “Cache-Control” “:” cache-directive。
表 1 展示了适用的值。
表 2 表明在不同的情形下,浏览器是将请求重新发送到服务器还是使用缓存的内容。
表 2. 对 cache-directive 值的浏览器响应
Cache-Control是关于浏览器缓存的最重要的设置,因为它覆盖其他设置,比如 Expires 和 Last-Modified。另外,由于浏览器的行为基本相同,这个属性是处理跨浏览器缓存问题的最有效的方法。
过期头 (Expires)
Expires 头部字段提供一个日期和时间,响应在该日期和时间后被认为失效。失效的缓存条目通常不会被缓存(无论是代理缓存还是用户代理缓存)返回,除非首先通过原始 服务器(或者拥有该实体的最新副本的中介缓存)验证。(注意:cache-control max-age 和 s-maxage 将覆盖 Expires 头部。)
Expires 字段接收以下格式的值:“Expires: Sun, 08 Nov 2009 03:37:26 GMT”。如果查看内容时的日期在给定的日期之前,则认为该内容没有失效并从缓存中提取出来。反之,则认为该内容失效,缓存将采取一些措施。表 3-6 表明针对不同用户操作的不同浏览器的行为。
表 3. 当用户打开一个新的浏览器窗口时的失效操作
表 4. 当用户在原始浏览器窗口中单击 Enter 按钮时的失效操作
表 5. 当用户按 F5 键刷新页面时的失效操作
表 6. 当用户单击 Back 或 Forward 按钮时的失效操作
注意:所有浏览器都假定为使用默认设置运行。
控制文件是否有修改 Last-Modified/E-Tag
Last-Modified 实体头部字段值通常用作一个缓存验证器。简单来说,如果实体值在 Last-Modified 值之后没有被更改,则认为该缓存条目有效。ETag 响应头部字段值是一个实体标记,它提供一个 “不透明” 的缓存验证器。这可能在以下几种情况下提供更可靠的验证:不方便存储修改日期;HTTP 日期值的 one-second 解决方案不够用;或者原始服务器希望避免由于使用修改日期而导致的某些冲突。
不同的浏览器有不同的配置行为。表 7-10 表明针对不同用户操作的不同浏览器的行为。
表 7. 当用户打开一个新的浏览器窗口时的 Last-Modified E-Tag 操作:
表 8. 当用户在原始浏览器窗口中单击 Enter 按钮时的 Last-Modified E-Tag 操作
表 9. 当用户按 F5 键刷新页面时的 Last-Modified E-Tag 操作
表 10. 没有缓存设置且用户单击 Back 或 Forward 按钮
注意:所有浏览器都假定使用默认设置运行。
不进行任何缓存相关设置
如果您不定义任何缓存相关设置,则不同的浏览器有不同的行为。有时,同一个浏览器在相同的情形下每次运行时的行为都是不同的。情况可能很复杂。另外,有些不该缓存的内容如果被缓存,将会导致安全问题。 不同的浏览器有不同的行为。表 11 展示了不同的浏览器行为。
表 11. 没有缓存设置且用户打开一个新的浏览器窗口
关键结论
HTTP1.1/HEADER说明
利用 HTTP Cache来优化网站
缓存控制头 Cache-Control
Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为。这些指令 通常覆盖默认缓存算法。缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。
cache-control 定义是:Cache-Control = “Cache-Control” “:” cache-directive。
表 1 展示了适用的值。
Cache-directive | 说明 |
public | 所有内容都将被缓存 |
private | 内容只缓存到私有缓存中 |
no-cache | 所有内容都不会被缓存 |
no-store | 所有内容都不会被缓存到缓存或 Internet 临时文件中 |
must-revalidation/proxy-revalidation | 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证 |
max-age=xxx (xxx is numeric) | 缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高 |
表 2 表明在不同的情形下,浏览器是将请求重新发送到服务器还是使用缓存的内容。
表 2. 对 cache-directive 值的浏览器响应
Cache-directive | 打开一个新的浏览器窗口 | 在原窗口中单击 Enter | 按钮 刷新 | 单击 Back 按钮 |
public | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器重新发送请求到服务器 | 浏览器呈现来自缓存的页面 |
private | 浏览器重新发送请求到服务器 | 第一次,浏览器重新发送请求到服务器;此后,浏览器呈现来自缓存的页面 | 浏览器重新发送请求到服务器 | 浏览器呈现来自缓存的页面 |
no-cache/no-store | 浏览器重新发送请求到服务器 | 浏览器重新发送请求到服务器 | 浏览器重新发送请求到服务器 | 浏览器重新发送请求到服务器 |
must-revalidation/proxy-revalidation | 浏览器重新发送请求到服务器 | 第一次,浏览器重新发送请求到服务器;此后,浏览器呈现来自缓存的页面 | 浏览器重新发送请求到服务器 | 浏览器呈现来自缓存的页面 |
max-age=xxx (xxx is numeric) | 在 xxx 秒后,浏览器重新发送请求到服务器 | 在 xxx 秒后,浏览器重新发送请求到服务器 | 浏览器重新发送请求到服务器 | 在 xxx 秒后,浏览器重新发送请求到服务器 |
Cache-Control是关于浏览器缓存的最重要的设置,因为它覆盖其他设置,比如 Expires 和 Last-Modified。另外,由于浏览器的行为基本相同,这个属性是处理跨浏览器缓存问题的最有效的方法。
过期头 (Expires)
Expires 头部字段提供一个日期和时间,响应在该日期和时间后被认为失效。失效的缓存条目通常不会被缓存(无论是代理缓存还是用户代理缓存)返回,除非首先通过原始 服务器(或者拥有该实体的最新副本的中介缓存)验证。(注意:cache-control max-age 和 s-maxage 将覆盖 Expires 头部。)
Expires 字段接收以下格式的值:“Expires: Sun, 08 Nov 2009 03:37:26 GMT”。如果查看内容时的日期在给定的日期之前,则认为该内容没有失效并从缓存中提取出来。反之,则认为该内容失效,缓存将采取一些措施。表 3-6 表明针对不同用户操作的不同浏览器的行为。
表 3. 当用户打开一个新的浏览器窗口时的失效操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
内容没有失效 | 浏览器呈现来自缓存的页面 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 |
内容失效 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 |
表 4. 当用户在原始浏览器窗口中单击 Enter 按钮时的失效操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
内容没有失效 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器重新发送请求到服务器。返回代码是 304 | 浏览器重新发送请求到服务器。返回代码是 304 |
内容失效 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器呈现来自缓存的页面 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 |
表 5. 当用户按 F5 键刷新页面时的失效操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
内容没有失效 | 浏览器重新发送请求到服务器。返回代码是 304 | 浏览器重新发送请求到服务器。返回代码是 304 | 浏览器重新发送请求到服务器。返回代码是 304 | 浏览器重新发送请求到服务器。返回代码是 304 |
内容失效 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 |
表 6. 当用户单击 Back 或 Forward 按钮时的失效操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
内容没有失效 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 |
内容失效 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器重新发送请求到服务器。返回代码是 200 |
注意:所有浏览器都假定为使用默认设置运行。
控制文件是否有修改 Last-Modified/E-Tag
Last-Modified 实体头部字段值通常用作一个缓存验证器。简单来说,如果实体值在 Last-Modified 值之后没有被更改,则认为该缓存条目有效。ETag 响应头部字段值是一个实体标记,它提供一个 “不透明” 的缓存验证器。这可能在以下几种情况下提供更可靠的验证:不方便存储修改日期;HTTP 日期值的 one-second 解决方案不够用;或者原始服务器希望避免由于使用修改日期而导致的某些冲突。
不同的浏览器有不同的配置行为。表 7-10 表明针对不同用户操作的不同浏览器的行为。
表 7. 当用户打开一个新的浏览器窗口时的 Last-Modified E-Tag 操作:
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
内容自上次访问以来没有被修改 | 浏览器重新发送请求到服务器。返回代码是 304 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 304 | 浏览器重新发送请求到服务器。返回代码是 304 |
内容自上次访问以来已经被修改 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 |
表 8. 当用户在原始浏览器窗口中单击 Enter 按钮时的 Last-Modified E-Tag 操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
内容自上次访问以来没有被修改 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器重新发送请求到服务器。返回代码是 304 | 浏览器重新发送请求到服务器。返回代码是 304 |
内容自上次访问以来已经被修改 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器呈现来自缓存的页面 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 |
表 9. 当用户按 F5 键刷新页面时的 Last-Modified E-Tag 操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
内容自上次访问以来没有被修改 | 浏览器重新发送请求到服务器。返回代码是 304 | 浏览器重新发送请求到服务器。返回代码是 304 | 浏览器重新发送请求到服务器。返回代码是 304 | 浏览器重新发送请求到服务器。返回代码是 304 |
内容自上次访问以来已经被修改 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 |
表 10. 没有缓存设置且用户单击 Back 或 Forward 按钮
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
内容自上次访问以来没有被修改 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 |
内容自上次访问以来已经被修改 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器重新发送请求到服务器。返回代码是 200 |
注意:所有浏览器都假定使用默认设置运行。
不进行任何缓存相关设置
如果您不定义任何缓存相关设置,则不同的浏览器有不同的行为。有时,同一个浏览器在相同的情形下每次运行时的行为都是不同的。情况可能很复杂。另外,有些不该缓存的内容如果被缓存,将会导致安全问题。 不同的浏览器有不同的行为。表 11 展示了不同的浏览器行为。
表 11. 没有缓存设置且用户打开一个新的浏览器窗口
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
打开一个新页面 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 |
在原始窗口中单击 Enter 按钮 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器呈现来自缓存的页面。 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 |
按 F5 键刷新 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 |
单击 Back 或 Forward 按钮 | 浏览器呈现来自缓存的页面。 | 浏览器呈现来自缓存的页面。 | 浏览器重新发送请求到服务器。返回代码是 200 | 浏览器重新发送请求到服务器。返回代码是 200 |
关键结论
操作 | 行为 |
打开新窗口 | 如果指定cache- control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了 max-age值,那么在此值内的时间里就不会重新访问服务器,例如:Cache-control: max-age=5 表示当访问此网页后的5秒内再次访问不会去服务器. |
在地址栏回车 | 如果值为private或must-revalidate,则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。 |
按后退按扭 | 如果值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问. |
按刷新按扭 | 无论为何值,都会重复访问. |
发表评论
-
webpack4 - 安装
2019-04-15 17:50 0webpack4 安装 -
项目中使用webpack5
2017-11-26 16:40 1513近期react及vueJs的普及,ES6也有相应的推广及普及, ... -
PIXI 完整示例-PIXI文档翻译(7)
2017-02-27 10:04 900案例研究:寻宝者 所 ... -
PIXI 碰撞检测-PIXI文档翻译(6)
2017-02-27 09:59 1771你现在知道如何制作各种各样的图形对象,但你能用他们做什么?一个 ... -
PIXI 基本图形-PIXI文档翻译(6)
2017-02-26 18:06 29291、基本图形 使用图像纹理是制作精灵的最有用的方法之一,但Pi ... -
PIXI 分组 Sprite-PIXI文档翻译(5)
2017-02-26 11:55 13841、分组sprite 组可以创建游戏场景,并将类似的精灵一起管 ... -
PIXI 移动 Sprite-PIXI文档翻译(4)
2017-02-26 11:38 1319你现在知道如何显示精灵,但是你怎么让他们移动?这很容易:使用创 ... -
PIXI 创建 Sprite的几种方法-PIXI文档翻译(3)
2017-02-26 11:25 55771、通过spritesheets图创建sprite 你现在知 ... -
PIXI Sprite的定位,尺寸和旋转-PIXI文档翻译(2)
2017-02-26 00:14 59121、定位Sprite 现在你知道如何创建和显示精灵,让我们了解 ... -
PIXI入门-PIXI文档翻译(1)
2017-02-25 09:47 35051、创建渲染器和舞台 ... -
如何快速的开放一个小游戏
2016-11-02 20:50 01、找一个可用的框架 2、通读一下文档和源码 3、搞一个小创意 ... -
生产环境页面性能监控
2013-04-18 00:46 1881嵌入式的开发 在代码片断中嵌入各个时间点,最后统一上报。 一 ... -
XSS攻击原理解析
2013-04-16 23:49 2665XSS全称Cross Site Script,跨站脚本攻击 它 ... -
CRSF攻击原理解析
2013-04-16 23:02 7908CRSF全称 Cross Site Request Forge ... -
页面性能优化
2013-03-27 21:56 1832压缩JS,CSS,图片 合并 ... -
JavaScript异常监控
2013-03-27 21:50 2212JavaScript异常一般可通过try ca ... -
HTML5 geolocation 规范翻译
2013-04-22 13:32 1894摘要 规范定义了脚本方式访问主机地理位置信息的API。 安全 ... -
JS文档构建(jsdoc)
2012-06-07 02:08 1661一、命令分类 类定义 @class 类型定义 @ve ... -
HTML5 Forms
2012-06-03 22:16 1232表单元素类型 常用:tel, email, date, url ... -
HTML5 WebSocket
2012-06-02 11:12 24231.WebSocket的优缺点 大 ...
相关推荐
浏览器缓存机制的过程如下: 强缓存(本地缓存) 强缓存是最彻底的缓存,无需向服务器发送请求,通常用于css、js、图片等静态资源。浏览器发送请求后会先判断本地是否有缓存。如果无缓存,则直接向服务器发送请求;...
Warning: Cannot modify header information – headers already ...开启OB缓存的方式有如下两种: 1. php.ini中开启 output_buffering = 4096 启用了此指令,那么每个PHP脚本都相当于一开始就调用了ob_start()函数,PH
4. HTTP缓存(浏览器缓存机制) 强缓存 协商缓存 5. 不同版本HTTP HTTP 0.9 HTTP 1.0 HTTP 1.1 HTTP 2.0 (一)HTTP原理 这部分学习并参考于:HTTP协议超级详解 超文本传输协议(英文:HyperText Transfer Protocol...
Web浏览器缓存机制 HTTP报文详解 HTTP握手以及TCP标示位详情 网站加载Waiting (TTFB) 优化 框架 理解zone.js Angular7升级到8 angular 版本新特性 Vue响应式原理 算法 Excel行列解析算法 LeetCode 工具 Gulp的工作...
缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定...这种机制就是所谓的缓存机制。 .NET 4.0的缓存功能主要由三部分组成:System.Runtime.Caching,System.Web.Caching
Vary 头部定义了缓存机制在构建其缓存键值时应当将哪个请求头标考虑在内。 例如,如果网页的内容取决于用户的语言偏好,该页面被称为根据语言而不同。 缺省情况下,Django 的缓存系统使用所请求的路径(比如:”/...
IOS缓存机制详解 ios系类教程之用instruments来检验你的app Android 学习笔记之 SQLite基础用法 如何充分利用 Windows Phone 高清屏幕 【cocos2d-x 手游研发----博彩大转盘】 后端架构 回顾2013:HBase的提升与挑战...
⑥js解决获取浏览器的唯一标识 ⑦js实现对数字自定义格式输出 ⑧js实战之全部替代一个子串为另一个子串 2、JavaSE目录 1、递归算法之输出某个目录下所有文件和子目录列表 2、泛型中extends和super的区别 3、内部类...
路由信息协议(RIP) 109 12.1 理解RFC1058 109 12.1.1 RIP报文格式 109 12.1.2 RIP路由表 111 12.2 操作机制 112 12.2.1 计算距离向量 113 12.2.2 更新路由表 116 12.2.3 寻址问题 118 12.3 ...
5.8 hibernate的缓存机制 332 5.8.1 hibernate的缓存分类 332 5.8.2 hibernate的缓存范围 332 5.8.3 hibernate的缓存管理 333 5.8.4 hibernate二级缓存的并发访问策略 333 5.8.5 hibernate的二级缓存配置 334 ...
6.8 高速缓存 52 6.9 反向解析(Pointer)查询 52 6.10 DNS安全 52 6.11 资源记录 53 6.12 小结 54 第7章 WINS 55 7.1 NetBIOS 55 7.2 NetBIOS名字解析 57 7.3 动态NetBIOS名字解析 58 7.3.1 使用WINS的优点 58 7.3.2 ...
该属性设置浏览器是否缓存静态内容.当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false. struts.enable.DynamicMethodInvocation 该属性设置Struts 2是否支持动态方法调用,该属性...
浏览器 HTTP 的缓存机制 Event Loop 预编译 进阶 前端性能初探-h5 工作笔记 百度地图换高德地图中遇到的坑 复习正则 vue路由守卫 使用Dijkstra算法实现最短路线规划 Flutter flutter路由详解 flutter安装包App....
首先我们知道http是一种无状态的请求,他的生命周期就是从客户端浏览器发出请求开始,到得到响应结束。那么MVC应用程序从发出请求到获得响应,都做了些什么呢? 本文我们会详细讨论MVC应用程序一个请求的生命周期,...
可扩展性,增加config.xml文件配置,可以自由扩展,但是注意:修改config.xml之后需要重启IIS,因为使用了缓存机制。 <br>[使用方法:] 1. 将Winsteps.Validator.dll引入到项目中; 2. 将WinValidatorFiles...
7、文章分享,字体大小调整,宽屏浏览等组件,支持cookies,当你点击宽屏之后,一个月内,除非你再次点击显示侧边栏或者清空浏览器缓存才会切换回双栏模式 8、首页自动文章摘要(字数后台可调整),自动获取文章...
在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以往直接sdcard根目录上直接新建...
1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................
8.2 clientscriptmanager类功能详解 301 8.2.1 registerarraydeclaration方法 301 8.2.2 registerclientscriptblock方法 302 8.2.3 registerclientscriptinclude方法 303 8.2.4 registerclientscriptresource...
8.2 clientscriptmanager类功能详解 301 8.2.1 registerarraydeclaration方法 301 8.2.2 registerclientscriptblock方法 302 8.2.3 registerclientscriptinclude方法 303 8.2.4 registerclientscriptresource...