nginx-13 浏览器缓存
浏览器的缓存由头信息中的几组参数控制。
etag/if_None_match
它默认是开启的,新建个站点,不做任何处理
server{
listen 80;
server_name mydomain.com;
index index.html;
root /www/wwwroot;
}
第一次访问时:
服务器返回一个Etag参数,"5c73f24b-8e"是服务器对资源的唯一标识,代表的就是index.html找个资源。这个资源可以理解为html代码,"5c73f24b-8e"可以理解为计算index.html代码字符串加密后的值(实际并不一定如此)。
etag = md5('<html lang="en"><head><meta charset="UTF-8"></head><body>hello world!</body</html>'); //etag=5cccf1da44e9c792261ab30796ece8e9
修改资源后etag = md5('<html lang="en"><head><meta charset="UTF-8"></head><body>hello world123456!</body</html>');//etag=78cdf080f36820c01ca36ba9dfae4586
此时浏览器将index.html的资源缓存起来,并且将etag值储存起来。
第二次访问时:
浏览器用if_none_match参数携带上一次服务器返回的etag值If-None-Match "5c73f24b-8e"
,问服务器if_none_match? (是否没有匹配到资源?),服务器会将资源重新生成etag, 如果仍然是"5c73f24b-8e"
,说明资源并没有被修改,则直接返回304,告诉浏览器从浏览器中的缓存中读取。
当修改资源时:
将index.html编辑修改后
第一次和第二次请求对比
Last-Modified/If-Modified-Since
如果对上面理解的话,这组参数很容易就能明白了。modified修改
资源没有被修改的情况:
上一次和这一次,服务器告诉浏览器资源修改时间是一样的,说明资源一直没有被修改。
当修改文件后
last-Modified > if-Modified-Since 说明资源修改过了。
Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。
cache-controll
Last-Modified与ETag固然是大大节省了带宽和服务器压力,但是每个请求都进行etag计算和对比,当一个网页有大量的资源请求时,对服务器也有一定的压力。
有些资源如图片、js\css,我们确保其在一定时间内不会有改变,则告诉浏览器不需要向服务器请求,直接加载浏览器缓存即可。
cache-controll大量应用在网站上,比如CNDN论坛
原理图
第一次请求:
第二次请求:
有关expires这篇文章比较好
https://www.cnblogs.com/dee0912/p/4743768.html?tdsourcetag=s_pcqq_aiomsg