相信很多做WEB的朋友都有遇到过浏览器缓存的问题 为了及时看到修改的效果 F5光荣的成为了按下频率最高的键(至少我是这样的)而且是屡试不爽啊 ⋯⋯等等,有时候确实很不爽——
如遇到缓存的时候
每当这个时候,要么Ctrl+F5,要么手动删除临时文件,甚至在网站里设置无缓存,可以说什么招都用上了,不过其原理倒是一直没有深究过
然后发现一个有趣的现象
1.从其他页面跳回某页面或者新打开这个页面的时候,如果有缓存,图片、css、js都不会下载而是直接使用缓存
2.在当前页面刷新时(无论是刷新还是强制刷新),所有通过html以及css加载的元素都会重新下载
3.(最神奇的一点)通过js加载的文件,只要缓存在,就没见它刷新过。
联想自己写php的时候,很多时候都会将缓存的有效时间设置为负值,以保证网站被修改时始终能“即时刷新”。
老实说我不知道我们这个网站有没有使用这一点,我也拿不准上面3条是不是通用的情况,于是我开始思考:
默认的浏览器缓存机制是怎么样呢?
浏览器是通过Last-Modified和Expires两种机制来处理缓存的
过期头 (Expires) 机制
Expires 头部字段提供一个日期和时间,响应在该日期和时间后被认为失效。失效的缓存条目通常不会被缓存(无论是代理缓存还是用户代理缓存)返回,除非首先通过原始 服务器(或
者拥有该实体的最新副本的中介缓存)验证。
就我这个俗人来点通俗一点的理解这个就是和cookies的有效期是类似的
控制文件是否有修改 Last-Modified/E-Tag 机制
Last-Modified 实体头部字段值通常用作一个缓存验证器。简单来说,如果实体值在 Last-Modified 值之后没有被更改,则认为该缓存条目有效。ETag 响应头部字段值是一个实体标记,
它提供一个 “不透明” 的缓存验证器。这可能在以下几种情况下提供更可靠的验证:不方便存储修改日期;HTTP 日期值的 one-second 解决方案不够用;或者原始服务器希望避免由于
使用修改日期而导致的某些冲突。
一个不太形象也不太具象的比喻就是 验证文件的“希哈值”(比喻,比喻而已,非专业的)
然后了解在浏览器中各种刷新的响应机制:
F5:不允许浏览器直接使用本地缓存,因此Last-Modified能起作用,但Expires无效
Ctrl+F5:是强制刷新,因此缓存机制失效
“转至”或地址栏里回车:正常的访问,Last-Modified和Expires都有效
Ps:不生成缓存除了设置 http头外 加密内容和使用Post传输也不会生成缓存
如遇到缓存的时候
每当这个时候,要么Ctrl+F5,要么手动删除临时文件,甚至在网站里设置无缓存,可以说什么招都用上了,不过其原理倒是一直没有深究过
然后发现一个有趣的现象
1.从其他页面跳回某页面或者新打开这个页面的时候,如果有缓存,图片、css、js都不会下载而是直接使用缓存
2.在当前页面刷新时(无论是刷新还是强制刷新),所有通过html以及css加载的元素都会重新下载
3.(最神奇的一点)通过js加载的文件,只要缓存在,就没见它刷新过。
联想自己写php的时候,很多时候都会将缓存的有效时间设置为负值,以保证网站被修改时始终能“即时刷新”。
老实说我不知道我们这个网站有没有使用这一点,我也拿不准上面3条是不是通用的情况,于是我开始思考:
默认的浏览器缓存机制是怎么样呢?
浏览器是通过Last-Modified和Expires两种机制来处理缓存的
过期头 (Expires) 机制
Expires 头部字段提供一个日期和时间,响应在该日期和时间后被认为失效。失效的缓存条目通常不会被缓存(无论是代理缓存还是用户代理缓存)返回,除非首先通过原始 服务器(或
者拥有该实体的最新副本的中介缓存)验证。
就我这个俗人来点通俗一点的理解这个就是和cookies的有效期是类似的
控制文件是否有修改 Last-Modified/E-Tag 机制
Last-Modified 实体头部字段值通常用作一个缓存验证器。简单来说,如果实体值在 Last-Modified 值之后没有被更改,则认为该缓存条目有效。ETag 响应头部字段值是一个实体标记,
它提供一个 “不透明” 的缓存验证器。这可能在以下几种情况下提供更可靠的验证:不方便存储修改日期;HTTP 日期值的 one-second 解决方案不够用;或者原始服务器希望避免由于
使用修改日期而导致的某些冲突。
一个不太形象也不太具象的比喻就是 验证文件的“希哈值”(比喻,比喻而已,非专业的)
然后了解在浏览器中各种刷新的响应机制:
F5:不允许浏览器直接使用本地缓存,因此Last-Modified能起作用,但Expires无效
Ctrl+F5:是强制刷新,因此缓存机制失效
“转至”或地址栏里回车:正常的访问,Last-Modified和Expires都有效
Ps:不生成缓存除了设置 http头外 加密内容和使用Post传输也不会生成缓存