首先Cache-Control有哪些特性呢?一个是可缓存性
可缓存性
public: 代表这个http请求返回的内容所经过的任何路径中,包括一些中间的http的代理服务器,以及发出这个请求的客户端浏览器,他都可以进行这个返回内容的缓存的操作
private: 代表只有发起请求的浏览器才可以进行缓存
no-cache: 任何一个节点都不可以进行缓存
到期
max-age=<seconds>: 多少秒以后过期,再重新请求
s-maxage=<seconds>: 会代替max-age,但是只有代理服务器里面才会生效,也就是浏览器端还是会读取max-age的时间
max-stale=<seconds>: 如果返回过期之后,但是只要在max-stale的时间内,他还是可以使用缓存,而不需要去原服务器里面请求一个新的内容,这个设置只有发起端才有用
重新验证(不太会用到)
must-revalidate: 在设置了max-age,重新发送请求的时候,再重新验证这个内容是否已经真的过期了
proxy-revalidate: 跟must一样的意思,但是是在代理服务器上用的
其他
no-store: 本地和代理服务器都不可以使用缓存,彻底的不能用,但是no-cache经过验证后可能可以使用
no-transform: 主要用在proxy服务器那边,意思是不要随便改动返回的内容,比如压缩,分片等格式转换
这些头只是声明性的作用,他没有任何强制性的约束力,比如设置一些,让代理服务器按照规范去做,但是完全可以不按照规范做
// server.js
const http = require('http');
const fs = require('fs'); http.createServer(function(req,res){
  console.log('req come', req.url);   if (req.url === '/') {
    const html = fs.readFileSync('test.html', 'utf8');
    res.writeHead(200,{
      'Content-Type': 'text/html'
    })
    res.end(html);
  }   if (req.url === '/script.js') {
    res.writeHead(200,{
      'Content-Type': 'text/javascript'
    })
    res.end('console.log("script loaded")');
  }
}).listen(8888); console.log('server listening on 8888');
console.log('http://localhost:8888/')
<!--test.html-->
<body>
  <script src='/script.js'></script>
</body>

启动server,可以看到script.js已经加载好了,这代表整个都是通过网络传输过来的,现在将max-age设为20s

if (req.url === '/script.js') {
  res.writeHead(200,{
    'Content-Type': 'text/javascript',
    'Cache-Control': 'max-age=20'
  })
  res.end('console.log("script loaded")');
}

可以看到刷新的时候,已经从缓存里面去请求了,这里把js内容改了,如果没到时间,还是读的缓存,没有读取新的js文件,这是因为 url 没变,所以设置了cache-control,只是客户端缓存,直接读取客户端缓存,根本不经过服务端验证,所以服务端更新了文件之后,客户端并不知道服务端已经更新了
我们希望客户端读取的是缓存,但是又不希望服务端内容更新了之后,比如css,image,js。客户端请求的还是老的资源,常见的做法是使用hash码,这个hash码是根据内容生成的一个hash码,如果内容没变,hash不变,如果内容变了,hash也会变,有了变化之后就是一个新的请求
cache-control通过逗号设置不同的值,同类型会从后往前覆盖
'Cache-Control': 'max-age=20,public,private'

缓存头Cache-Control的含义和使用的更多相关文章

  1. 网站 cache control 最佳实践

    推荐阅读: 2020年软件开发趋势 高并发案例 - 库存超发问题 负载均衡的分类及算法 异地多活架构 Postman 的替代品来了 有时,当第二次访问网站时,看起来比较怪,样式不正常. 通常,是因为 ...

  2. 缓存篇(Cache)~大话开篇

    回到占占推荐博客索引 闲话杂淡 想写这篇文章很久了,但总是感觉内功还不太够,总觉得,要写这种编程领域里的心法(内功)的文章,需要有足够的实践,需要对具体领域非常了解,才能写出来.如今,感觉自己有写这种 ...

  3. 从Java视角理解CPU缓存(CPU Cache)

    从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多 ...

  4. [Java 缓存] Java Cache之 DCache的简单应用.

    前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...

  5. 大话PHP缓存头

    304的请求机制和200有什么不一样呢?在fiddler中查看304请求的时候突然想到这个问题,就想到研究下这个304请求机制了. 我们自己在nginx上放一个文件,test.png.可以使用下面的地 ...

  6. HTML5学习总结-08 应用缓存(Application Cache)

    一 应用缓存(Application Cache) 1 应用缓存 HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: ...

  7. 如何在 Linux 中清除缓存(Cache)

              如何在 Linux 中清除缓存(Cache)            方法一: http://mp.weixin.qq.com/s?__biz=MjM5ODAzODgyMQ==&am ...

  8. 关于Linux的缓存内存 Cache Memory详解<转>

    转自 http://www.ha97.com/4337.html PS:前天有童鞋问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存 ...

  9. ASP.NET缓存中Cache过期的三种策略

    原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. <asp:Button ID=&quo ...

  10. Kafka元数据缓存(metadata cache)

    经常有人问的一个问题就是:Kafka broker到底是不是无状态的?网上有这样的说法: 正常情况下consumer会在消费完一条消息后线性增加这个offset.当然,consumer也可将offse ...

随机推荐

  1. 转 JDBC连接数据库(二)——连接池

    https://www.cnblogs.com/xiaotiaosi/p/6398371.html 数据库保持长连接,不过一直都是idle,除非有用户激活连接,这样后果是无法删除用户,但是不影响数据库 ...

  2. [转]创建一个JavaScript弹出DIV窗口层的效果

    本文转自:http://www.soso.io/article/23698.html <!doctype html> <html lang="en"> &l ...

  3. Murano Weekly Meeting 2015.10.13

    Meeting time: 2015.October.13th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting sum ...

  4. 使用Xshell连接服务器

    转载原地址:http://www.server110.com/linux/201308/830.html 1)关于Xshell 网上更多的资料里提到的SSH客户端是putty,因为简单.开源.免费.但 ...

  5. Java工具-检验ftp服务器的指定文件是否存在

    项目工作中,需要检验ftp服务器中指定文件是否存在,在网上查阅了相关资料,可以通过ftpClient类进行实现. import org.apache.commons.net.ftp.FTP; impo ...

  6. python 字符串转字节数组

    场景: java加解密和python加解密互转的时候,因一些非显示字符无法确认两者是否一致,故需要打出他们的十六进制字节数组进行比较 1.python代码实现 str='123';print str. ...

  7. shell脚本的使用

    $#  返回命令行参数个数 $n  接受终端指定位置参数 $*  接受终端所有参数(不包含 $0) $@  接受终端所有参数(不包含 $0,在for循环时和 $* 的表现有差异) $?  返回上一次程 ...

  8. 动态配置log4j2.xml日志输出文件的位置

    目标:根据启动jar时传进main()的参数动态修改日志位置 一.修改启动项 MainMapLookup.setMainArguments(args);注:不要在lookup设置之前初始化log(如: ...

  9. 为什么document.write()会清空原来的内容

    为什么document.write()会清空原来的内容: 可能很多朋友都遇到过这样的情况,那就是使用document.write()函数向网页中写内容的时候,会把文档中的原来的内容给清空,这一点对于初 ...

  10. 给主程序签名及第三方dll强签名

    给主程序添加签名   添加完成后会自动生成一个*.pfx文件.     给程序添加强签名方法:   本文以Quartz.dll为例,使用vs Tools下的工具命令.   打开命令工具是这个样子,   ...