HTTP 协议缓存控制
我们观察图片的下载,往往
第1次请求时200OK
第2次请求时304Not Modified未修改状态
解释:在网络上有一些缓存服务器,浏览器自身也有缓存功能
当我们第一次某图片时,正常下载图片.返回值200
基于一个前提–图片不会经常改动,服务器在返回200的同时,返回该图片的“签名”–Etag,(签名可以理解图片的“指纹”)
当浏览再次访问该图片时,去服务器校验“指纹”
如果图片没有发变化,直接使用缓存里的图片,这样减轻了服务器的负担
抓包观察:
第一次请求头:
没有太大变化
就简单的GET方法
第一次响应头 :
Etag:就相当于文件的指纹
Last Modified:上次修改的时间
第二次请求头:
If-Modified-Since If-None-Match
这两行的意思是:
如果自“Tue,18Jun 2020 10 9:44:55 GMT“这个时间点以后,图片修改过,则重新请求
如果该图片最新的Etag的值和If-None-Match的值不匹配,则重新请求
第二次响应头:
如果是304,就意味着浏览器从本地取缓存,节省了图片在我网络上传输的时间
选学:
HTTP协议与缓存控制
如果网站比较大,有N台缓存服务器,那么这N台缓存服务器如何处理服务器上的文件。
- 要不要缓存
- 缓存多久?
思考–这说明缓存服务器与主服务器之间,应该有一些协议来说明这2个问题?
追问—用什么协议来说明这2个问题
答:还是用http协议 用头信息 cache-control来控制
利用协议控制缓存
相关模块:mod_expires
具体用法:
在主服务器,打开apache的expires扩展,利用该扩展来控制图片,css,html等文件
控制是否缓存及缓存生命周期
在htaccess中,具体语法如下:
ExpiresDefault“ [plus] { }* ”
ExpiresByType type/encoding “ [plus] { }* ”
ExpiresDefault是设置默认的缓存参数
ExpiresByType是按照文件类型来设置独特的缓存参数
我们用第2种来做测试给jpg图片设置1个月的生存周期
后4个参数怎么理解?
Base:基于哪个时间点来计算缓存有效期
Access/now:基于请求响应的那一瞬间。比如从此瞬间到1个月后
Modifiacation:基于被请求文件的最后修改日期来计算.比如 最后修改日期的后1周内仍然有效
Num:缓存时间的大小(30)
Type:缓存时间的单位(天)
ExpiresActive On
ExpiresByType image/jepg "access plus 30 days"
如果这是在集群环境里,缓存服务器得到此图片,将会认为一个月内有效
减轻了主服务器的负担
我们是否可以设置服务器没有缓存呢?
比如有些个人信息,不允许缓存服务器缓存,必须到主服务器去请求
Control-cache:no-store,must-revalidate;//这意味着不允许缓存,必须要去主服务器验证
可以利用apache的header模块
<FileMatch “.(gif)$”>过滤,如果是gif图执行下面的不进行缓存
header set Cache-control “no-store,must-revalidate”
ExpiresActive On
ExpiresByType image/jepg "access plus 30 days"
<FileMatch "\.(gif)$">
header set Cache-control "no-store,must-revalidate"
</FileMatch>
多次刷新页面发现gif不允许缓存,每次都重新请求 返回200OK
其他类型的可能返回304
HTTP协议与内容压缩
观察 我们打开163的一篇新闻
看到响应头信息
注意:Content-Length:36187
同时我们右键保存其源码,得到的文本文件的大小:136248 字节
思考:Content-Length的之前的学习中,我们知道,代表返回的主体的长度
但此处为什么返回的主体长度和Content-Length不一致呢?
原因在于:Content-Encoding:gzip这个响应头信息的作用
原理:为了加快网页在网络上的传输速度,服务器对主体信息进行压缩
如常见的gzip压缩,deflate压缩以及google chrome正在推得sdch压缩
压缩的过程:服务器返回压缩内容,客户端接收到压缩再解压缩再渲染页面
刚才的那个情况的原因----服务器对页面进行了压缩 content-length是压缩后的长度
如何在apache启用压缩功能?
利用编码压缩提高性能
-
开启deflate模块或gzip模块
-
在conf文件中写如下代码
<ifmodule mod deflate.c> DeflateCompressionLevel 6 //压缩级别为6,可选1-9,推荐为6 AddOutputFileByType DEFLATE text/plain//压缩文本文件 AddOutputFileByType DEFLATE text/html//压缩html文件 AddOutputFileByType DEFLATE text/xml //压缩xml文件 </ifmodule>
为什么要指定文件类型进行压缩?
答:压缩也是要耗CPU资源的,图片、视频等文件,压缩效果也不好.
一般压缩文本格式
问:服务器怎么知道我们的浏览器支持gzip的?
答:例如: Accep-Ecoding:gzip,deflate,sdch
客户端允许发一个 Accep-Ecoding头信息,与服务器协商
这个例子可以看出,chrome浏览器支持gzip,deflate,sdch 3种压缩方式
小技巧:当我们在采集时,可以不发送Accept-Encoding信息,这样采集直接是源码
当然也可以采集gzip(提高速度),再用票PHP解压gzip的内容.
HTTP协议与持久链接+分块链接---->反向ajax
反向ajax又叫comet,server,push服务器技术
应用范围:网页聊天服务器,新浪微博在线聊天 google mail网页聊天都有用到
原理:一般而言,HTTP协议的特点,链接<–>断开
具体什么时间断开?
服务器响应content-length,收到指定的length长度的内容时,也就断开了
在http1.1允许你不写content-length,比如要发送的长度确实不知道时
这事需要一个特殊的content-type:chunked
分块传输的原理是这样的:
123H\r\n
123H个长度的内容传输给客户端…\r\n
…
41H\r\n
浏览器继续接受41H长度的内容.\r\n
0\r\n(服务器说内容发完了)
length,收到指定的length长度的内容时,也就断开了
在http1.1允许你不写content-length,比如要发送的长度确实不知道时
这事需要一个特殊的content-type:chunked
分块传输的原理是这样的:
123H\r\n
123H个长度的内容传输给客户端…\r\n
…
41H\r\n
浏览器继续接受41H长度的内容.\r\n
0\r\n(服务器说内容发完了)