网络篇—浏览器缓存(一)

网络篇—浏览器缓存(一)

一、缓存类型

  • 有两种,强缓存和协商缓存
  1. 强缓存
    • 不会向服务器发送请求,直接从缓存中读取资源;
  2. 协商缓存
    • 向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;
  3. 异同
    • 共同点:都是从客户端缓存中读取资源;
    • 区别:强缓存不会发请求,协商缓存会发请求;

二、和缓存有关的header

  1. 强缓存
  • Expires:response header里的过期时间(绝对时间),浏览器再次加载资源时,如果在这个过期时间内,则命中强缓存。expires: Wed, 16 May 2018 13:23:04 GMT;
  • Cache-Control:当值设为max-age=300时,则代表在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。
  • Expires和Cache-Control的异同:
    • Expires 是http1.0的产物,设置的是绝对日期时间;
    • Cache-Control是http1.1的产物,设置max-age设置的是相对时间;
    • 两者同时存在的话,Cache-Control优先级高于Expires
  1. 协商缓存
  • ETag和If-None-Match
    1. Etag是上一次加载资源时,服务器返回的response header,是对该资源的一种唯一标识,只要资源有变化,Etag就会重新生成;
    2. 浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里,服务器接受到If-None-Match的值后,会拿来跟该资源文件的Etag值做比较,如果相同,则表示资源文件没有发生改变,命中协商缓存。
  • Last-Modified和If-Modified-Since
    • Last-Modified是该资源文件最后一次更改时间,服务器会在response header里返回,同时浏览器会将这个值保存起来,在下一次发送请求时,放到request header里的If-Modified-Since里,服务器在接收到后也会做比对,如果相同则命中协商缓存。
  • 两种协商缓存的区别:
    • 精确度上,Etag要优于Last-Modified。Last-Modified的时间单位是秒,如果某个文件在1秒内改变了多次,那么他们的Last-Modified其实并没有体现出来修改,但是Etag每次都会改变确保了精度;
    • 在性能上,Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值;
    • 在优先级上,服务器校验优先考虑Etag。

三、浏览器缓存过程

  1. 浏览器第一次加载资源,服务器返回200,浏览器将资源文件从服务器上请求下载下来,并把response header及该请求的返回时间一并缓存;
  2. 下一次加载资源时,先比较当前时间和上一次返回200时的时间差,如果没有超过cache-control设置的max-age,则没有过期,命中强缓存,不发请求直接从本地缓存读取该文件(如果浏览器不支持HTTP1.1,则用expires判断是否过期);
  3. 如果时间过期,则向服务器发送header带有If-None-Match和If-Modified-Since 的请求;
  4. 服务器收到请求后,优先根据Etag的值判断被请求的文件有没有做修改,Etag值一致则没有修改,命中协商缓存,返回304;如果不一致则有改动,直接返回新的资源文件带上新的Etag值并返回 200;
  5. 如果服务器收到的请求没有Etag值,则将If-Modified-Since和被请求文件的最后修改时间做比对,一致则命中协商缓存,返回304;不一致则返回新的last-modified和文件并返回 200;

四、设置浏览器缓存

  1. 通过HTML的META设置expires和cache-control
<meta http-equiv="Cache-Control" content="max-age=7200" />
<meta http-equiv="Expires" content="Sun Oct 15 2018 20:39:53 GMT+0800 (CST)" />
  • 此方法仅对该网页有效,对网页中的图片或其他请求无效。
  1. 图片,css,js,flash的缓存
  • 这些主要通过服务器的配置来实现这个技术;

五、用户行为对浏览器缓存的控制

  1. 地址栏访问,链接跳转是正常用户行为,将会触发浏览器缓存机制;
  2. F5刷新,浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断;
  3. ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维小白

12.14 Nginx访问控制

Nginx访问控制目录概要 需求:访问/admin/目录的请求,只允许某几个IP访问,配置如下: location /admin/ { allow 19...

50210
来自专栏CSDN技术头条

资源控制在大数据和云计算平台中的应用

本文针对大数据平台中资源控制这个层面来详细介绍资源控制在不同操作系统上的具体技术实现,以及大数据平台和资源控制的集成。

6378
来自专栏运维小白

Linux基础(day51)

12.13 Nginx防盗链 Nginx防盗链目录概要 配置如下,可以和上面的配置结合起来 location ~* ^.+\.(gif|jpg|png|swf|...

2305
来自专栏沈唁志

PHP中常用的header头

2573
来自专栏云计算教程系列

如何在Ubuntu 18.04上将Apache Web Root移动到新位置

在Ubuntu上,Apache Web服务器将其文档存储在/var/www/html中,该文档通常位于具有其余操作系统的根文件系统上。但有时,将文档根移动到另一...

530
来自专栏Felix的技术分享

《一个操作系统的实现》笔记(2)--保护模式

3888
来自专栏我叫刘半仙

原荐记一次服务器被植入挖矿木马cpu飙升200%解决过程

线上服务器用的是某讯云的,欢快的完美运行着Tomcat,MySQL,MongoDB,ActiveMQ等程序。突然一则噩耗从前线传来:网站不能访问了。 此项目是我...

4874
来自专栏云知识学习

SQLserver SSMS安装 连接SQLserver

SQLserver SSMS安装 连接SQLserver 以及使用SQLserver上传工具上传备份文件操作

3979
来自专栏北京马哥教育

11 个鲜为人知的 Linux 命令

英文:Tecmint,编译:Linux中国 linux.cn/article-2258-1.html Linux命令行吸引了大多数Linux爱好者。一个正常的...

3636
来自专栏专注数据中心高性能网络技术研发

Centos7.2/7.3集群安装Kubernetes 1.8.4 + Dashboard

1.环境配置 结点数量:3 结点系统:CentOS 7.2 / 7.3 ---- 2.效果展示 ? ? ---- 3.搭建Kubernetes环境【1】 3.1...

7076

扫码关注云+社区

领取腾讯云代金券