http协议缓存控制
第一次请求时200 ok
第二次请求304 not modified 为修改状态
解释: 在网络上有一些缓存服务器,另外浏览器自身也有缓存功能。
当我们第一次访问某个图片的时候,正常下载图片返回200 ok
基于一个前提-图片不会经常改动,服务器在返回200的时候,还返回该图片的”签名“ -- etag (签名可以理解为图片的“指纹”)
当浏览器再次访问该图片时,去服务器校验“指纹”
如果图片没有变化,直接使用缓存中的图片,这样减轻了服务器负担
抓包观察:
第一次请求:
第一次响应头: 在响应头里面可以看到请求的图片信息
etag:"321397979879-fndlsh32yfsh894392"
last-modified: Tue, 10 Jun 2018 12:12:12 GMT
第二次请求头:
第二次请求头里面:
if-modified-since: Tue, 10 Jun 2018 12:12:12 GMT
如果自Tue, 10 Jun 2018 12:12:12 GMT这个时间后图片没有修改则不会重新请求,如果有修改则会重新请求
if-none-match: "321397979879-fndlsh32yfsh894392"
如果该图片最新的etag值 和 if-none-match 的值不匹配,则重新请求
第二次响应头:
status code 304 not modified
如果是304就以为这浏览器从本地的缓存中取数据,节省了图片在网络上传输的时间
大网站的缓存:
如果网站比较大,有N台缓存服务器,那么这N台缓存服务器如何处理主服务器上的文件?
要不要缓存?
如果缓存该缓存多久呢?
缓存服务器与主服务器之间应该有一些协议,来说明这2个问题
用什么协议来说明这两个问题?
答: 还是http协议,用头信息,cache-control 来控制
利用协议控制缓存(apache服务器):
利用协议控制缓存:相关模块是---mod_expires
ExpiresActive On
ExpiresByType image/jpeg ‘access plus 1 month‘
控制是否缓存以及缓存周期
在.htaccess中,具体语法如下:
ExpiresDefault "<base> [plus] {<num> <type>}*"
ExpiresByType type/encoding "<base> [plus] {<num> <type>}*"
ExpiresDefault 是设置默认的缓存参数
ExpiresByType 是按照文件类型来设计独特的缓存参数
我们用第二种来做测试给jpg图片设置一个月的生存周期
后面4个参数怎么理解?
Base: 基于哪个时间点来计算缓存有效期
Access/now: 基于请求响应的那一瞬间,比如从此瞬间到一个月之后
Modification: 基于被请求文件的最后修改日期来计算,比如最后修改日期的后一周内仍然有效
num: 缓存时间的大小 (30)
type: 缓存时间的单位 (天)
实例:
如果这是在集群环境里,缓存服务器得到此图片,将会认为一个月内有效,从而减轻了主服务器的负担
利用协议取消缓存(apache服务器):
如果有些信息不要缓存,必须要去主服务器获取,那么要这样
客户端:
Cache-Control:no-cache
Pragma:no-cache
服务器端清除缓存:相关模块是:mod_header
<FileMatch "\.(jpg|gif|png)$">
Cache-Control:no-cache
Header unset Etag
Header unset Last-Modified
</FilesMatch>
revalidate:使重新生效,使从新有法律效力
多次刷新浏览器请求效果gif会始终都请求, jpeg 的会有缓存