http协议之缓存

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 的会有缓存
技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。