-
关于浏览器缓存
浏览器的资源请求,如果使用了缓存基本上是两种情况
- status code: 200 ok ( from cache )
- status code: 304 Not Modified
上面两种方式有什么区别呢?简单地说,第一种方式是不向浏览器发送请求,直接使用本地缓存文件。第二种方式,浏览器虽然发现了本地有该资源的缓存,但是不确定是否是最新的,于是想服务器询问,若服务器认为浏览器的缓存版本还可用,那么便会返回304。
浏览器关于缓存使用的决策
那么,浏览器如何决定是使用哪种方式呢?这就和服务器在请求返回中的Header字段有关了。下面对相关的字段进行简单介绍。
Cache-Control
Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。该字段通常覆盖默认缓存算法。另外,缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。
简单地说,该字段用于控制浏览器在什么情况下直接使用本地缓存而不向服务器发送请求。一般具有以下值:
-
public
: 所有内容都将被缓存 -
private
: 内容只缓存到似有缓存中 -
no-cache
: 所有内容都不会被缓存 -
no-store
: 所有内容都不会被缓存到缓存或者internet临时文件中 -
must-revalidation/proxy-revalidation
: 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证 -
max-age=xxx( xxx is numeric )
: 缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高
其中最常用的属性便是
max-age
, 这个字段很简单,就是浏览器在资源成功请求后的制定时间内,都将直接调用本地缓存和不会向服务器去请求数据。Expires
Expires 头部字段提供一个日期和时间,在该日期前的所有对该资源的请求都会直接使用浏览器缓存而不用向服务器请求(注意:cache-control max-age 和 s-maxage 将覆盖 Expires 头部。)
Expires 字段接收以下格式的值:“Expires: Sun, 08 Nov 2009 03:37:26 GMT”。
但是使用
Expires
存在服务器端时间和浏览器时间不一致的问题。Last-Modified/E-tag
Last-Modified
和E-tag
的作用都是向服务器确认当前缓存文件是否为最新。抛开功能不看,这两个字段的表现如下:- 若服务器在响应一个资源时添加了
Last-Modified
字段,那么当下一次浏览器再一次向服务器请求该资源时(前提是浏览器中上一次的资源被缓存过了),会在请求header中包含If-Modified-Since
字段,且值与服务器第一次响应给浏览器的Last-Modified
字段一致 - 若服务器在响应一个资源时添加了
ETag
字段,那么当下一次浏览器再一次向服务器请求该资源时(前提是浏览器中上一次的资源被缓存过了),会在请求header中包含If-None-Match
字段,且值与服务器第一次响应给浏览器的ETag
字段一致
那么上述是遵循了Http协议的浏览器会自动实现的,而要实现304的功能,就需要服务器(比如Apache对于静态资源会自动实现这两个字段的响应)或者我们手动在服务器端编写响应的逻辑来实现。
- 若服务器在收到的资源请求中发现含有
Last-Modified
字段,则说明浏览器中包含了该资源的某一版本的缓存,此时服务器端将根据该字段的值进行一定的逻辑判断,以决定让浏览器直接使用已有的缓存(返回304
)还是将最新的文件发送过去(200
,发送新文件并更新Last-Modified
字段) - 若服务器在收到的资源请求中发现含有
If-None-Matc
字段,则说明浏览器中包含了该资源的某一版本的缓存,此时服务器端将根据该字段的值进行一定的逻辑判断,以决定让浏览器直接使用已有的缓存(返回304
)还是将最新的文件发送过去(200
,发送新文件,并更新ETag
)
若同时使用了
Last-Modified
和ETag
,正确的做法应该是当两者都符合条件时,才返回304
什么时候使用ETag?
Etag
主要为了解决Last-Modified
无法解决的一些问题。- 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET。这种情况下可以将某个能用来表明文件内容是否被更改的值(比如
md5
)来作为ETag
- 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),
If-Modified-Since
能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒) - 某些服务器不能精确的得到文件的最后修改时间
不同的页面打开方式产生的请求区别
一般我们打开(或者更新)一个页面(或者资源)有几种方式:
- 在地址栏中输入地址,然后回车
- 激活当前页面地址,然后回车
- F5刷新页面
- 单机Back/Forward按钮
上面几种方式对资源的请求,会产生不同的结果,并且各浏览器的表现并不一致。具体的区别可以参考鸟哥的《浏览器缓存机制》
其中大家需要注意的一点是,刷新页面(F5或者刷新按钮),不管是否设置了
max-age
,都会重新像服务器发送请求。但是这不影响304
逻辑。实例代码测试
用
nodejs
写了一个简单的静态文件服务器,用来测试上面的Cache-Control
和Last-Modified
,具体代码可以看gist
例子比较简单,大体逻辑:
- 每个资源的
200
返回设置max-age=10
,即缓存10秒。同时设置Last-Modified
- 每次收到请求后,若发现包含
if-modified-since
字段,则304
测试过程和结果:
- 第一次请求,不管是
index.html
还是index.css
均为200
,且response中包含了max-age
和Last-Modified
- 在地址栏中回车(10s以内),
index.html
为304
,index.css
为200 ok ( from cache )
- 若对页面进行刷新( F5或者刷新页面 ),两者均为
304
(在10s内或者不在10s内)
需要注意的问题:
-
index.html
不管是否设置了max-age
,都是304
,同理,将index.css
直接放到地址栏中请求也是304
-
index.css
一次304
之后的10s内又能继续进行不需要请求服务器的直接本地缓存。这里我个人认为,浏览器的“直接使用本地缓存“的效果和从服务器成功200
到数据产生的效果是一致的,除了文件本身,header字段等信息也是同样会被cache的,因此304
之后,max-age
又可以被继续使用一遍。
做了
nodejs
的实验之后,又开启了apache
服务器,同样的将index.html
和index.css
文件放置到服务器根目录中,请求后,发现apache
默认已经做了Last-Modified
和ETag
的处理,并且在修改index.css
文件后,可以观察到这两个值的变化。
- 浏览: 175383 次
- 性别:
- 来自: 深圳
最新评论
-
ningv:
修改proguard.bat还是不行,看了LZ提供的论坛,里面 ...
有关 Conversion to Dalvik format failed with error 1 -
额外日记:
太棒了
Spring Framework API 2.5 chm版 -
chunjuan0126:
楼主,我现在用的是Android 4.3的,Android-1 ...
有关 Conversion to Dalvik format failed with error 1 -
夜色蓝:
真的好用,谢谢啦
有关 Conversion to Dalvik format failed with error 1 -
winnerph:
3q
Spring Framework API 2.5 chm版
相关推荐
浏览器缓存机制介绍与缓存策略剖析 浏览器缓存机制是指浏览器在请求资源时,对已经请求过的资源进行缓存,以便下次请求时可以直接从缓存中获取,从而提高页面加载速度和减少服务器的压力。本文将详细介绍浏览器缓存...
在这个特定的场景下,我们关注的是“Loadrunner负载测试中的浏览器缓存设置”。了解如何在LoadRunner中正确设置浏览器缓存对于获取真实用户行为的数据至关重要,因为这直接影响到测试结果的准确性。 浏览器缓存是...
2. 使用 jQuery Ajax 清除浏览器缓存:可以使用 $.ajax() 方法并设置 cache:false,或者使用 If-Modified-Since 和 Cache-Control 请求头来清除浏览器缓存。 3. 使用随机数或随机时间来避免缓存:可以在 URL 参数后...
### 浏览器缓存目录设置 在日常的网络浏览过程中,浏览器缓存的作用非常重要,它不仅能够提高网页加载速度,还能有效减少硬盘碎片的产生,进而提升整体系统的运行效率。本文将详细介绍如何针对不同浏览器(如Fire...
### JS浏览器缓存详解 #### 一、问题背景与概述 在进行Web开发的过程中,开发者可能会遇到一个较为隐蔽但十分常见的问题——浏览器缓存导致的重复请求失效现象。特别是使用某些JavaScript库(如Prototype.js)时,...
浏览器缓存是网络浏览的重要组成部分,它帮助用户快速加载先前访问过的网页,通过存储静态资源如图片、JavaScript和CSS文件,减少对服务器的请求。本文将深入探讨浏览器缓存的工作原理,以及如何使用“浏览器缓存...
### jsp去除浏览器缓存详解 #### 一、引言 在Web开发中,为了提高用户体验及页面加载速度,浏览器通常会缓存一部分资源。但有时为了确保用户获取到最新的内容,我们需要禁止或控制浏览器对特定页面的缓存。本文将...
以下是关于Chrome浏览器缓存、如何查看和导出缓存,以及该工具功能的详细解释。 首先,了解Chrome浏览器的缓存机制至关重要。浏览器缓存是Web浏览器为了提高网页加载速度而存储的部分网页内容,包括HTML文件、图片...
清除Flash缓存和各种浏览器缓存的方法 清除Flash缓存和各种浏览器缓存的方法是计算机用户常用的技术技能,以解决浏览器缓存引发的问题,如卡机、进不去、游戏滞后等问题。下面将详细介绍清除Flash缓存和各种浏览器...
### 三星T231清除浏览器缓存教程 #### 一、引言 随着移动互联网技术的飞速发展,智能手机已成为人们日常生活中不可或缺的一部分。在众多智能手机品牌中,三星凭借其出色的性能和丰富的功能深受用户喜爱。对于三星T...
浏览器缓存是网络浏览的重要组成部分,它用于存储网页的静态资源,如图片、JavaScript文件、CSS样式表等,以便在用户再次访问同一页面时能够快速加载,提高网页的响应速度和用户体验。`ChromeCacheView`是一款实用的...
Microsoft edge 浏览器缓存改成内存虚拟盘(盘符R) Microsoft edge 浏览器缓存改成内存虚拟盘(盘符R) Microsoft edge 浏览器缓存改成内存虚拟盘(盘符R)
1、【合并视频.exe】可将UC浏览器缓存或下载的Y2hlbmppbmdjb25n加密或非加密视频文件合并成mp4视频的工具。 2、使用示例:https://img-blog.csdnimg.cn/0a29f18018c246ebbe70efb82f72c288.png 该示例图可以复制链接...
来禁止浏览器缓存重定向的结果。 示例 新建一个web工程,命名为redirectTest,点击Finish,新建一个Servlet,如下图点击Next,输入如下图点击Next,如下图点击Finish,则一个Servlet创建完成。点击工程名,按下ALT+...
1、若是UC浏览器的视频文件:Y2hlbmppbmdjb25n0 Y2hlbmppbmdjb25n1 Y2hlbmppbmdjb25n2......用此工具类(合并无加密)。 2、若是0.ts、1.ts、2.ts类型视频合并到此:...
删除浏览器缓存的方法和 importance 浏览器缓存是一种临时存储在电脑里的网页内容和信息,以便提高访问网页的速度。但是,缓存也可能会导致网页不能及时更新和加载最新的数据。因此,定期清理浏览器缓存是非常必要...
如果视频被储存在浏览器的缓存文件夹中,这个软件可以帮助你从缓存文件夹中找到该视频文件并保存到其他位置。 它会自动扫描IE、基于Mozilla的网页浏览器(包括FireFox)的整个缓存文件夹,并找出当前储存在里面的所有...
浏览器缓存 浏览器缓存主要可以分为两大类:客户端缓存和服务端缓存。客户端缓存,即浏览器缓存,是本文主要讨论的内容。而服务端缓存则主要包括代理服务器缓存和反向代理服务器缓存,以及广泛使用的CDN等。这些...
Chrome浏览器缓存查看工具是一款专为用户设计的实用软件,旨在帮助用户轻松访问和管理Google Chrome浏览器中的缓存数据。这个工具允许用户查看并分析在浏览网页时存储的各种资源,如图片、音频、视频和文档等。对于...