缓存头Cache-Control的含义和使用

缓存Cache-Control的特性

a.可缓存性

  public : http请求返回的过程中,返回的数据可以在路径中的每个节点被缓存

  private : 只有请求的浏览器才可以缓存请求到的数据

  no-cache:  可以使用缓存,但是使用之前必需先通过服务器验证一下,如果源服务器验证

       后说可以使用本地的缓存,才可以使用。否则,需要重新请求数据。

b.到期

  max-age=<seconds>   缓存多长时间后到期,到期后浏览器就再次请求服务器里的数据。

  s-maxage=<seconds> 代理服务器可以识别这个选项,当同时设置了max-age和s-maxage

             代理服务器会优先识别s-maxage。

  max-stale=<seconds> 即便缓存过期了,只要在max-stale这个时间内,还是可以使用过期

             缓存。

c.重新验证

  must-revalidate 如果缓存到期了,浏览器必需向源服务器发起验证,请求新的数据。

  proxy-revalidate 如果缓存到期了,代理服务器也需要向源服务器请求数据。

d.其他

  no-store 永远都需要请服务器重新请求数据

  no-transform  主要是针对代理服务器,因为有些代理服务器可能比较有想法,认为源服务器

         返回的数据太大,会将数据压缩或者格式转化一下。这个配置就是告诉代理服

         器不要这么做。

----------------------------------------------------------------------

我们希望浏览器缓存数据缩短响应时间,但是当我们源服务器的数据更新后,如果浏览器还是使用缓存,就无法显示更新后的内容。

这怎么怎么办呢?前端解决方案是,在文件名前根据文件内容加上hash码,当文件内容发生变化后,hash码也会变化。

hash码变化后相当于文件的路径发生了变化,浏览器就会重新向服务器请求数据。

-----------------------------------------------------------------------
注意: 这些头只是一种申明,代理服务求,和浏览器遵守与否无法控制。

const http = require(‘http‘)
const fs = require(‘fs‘)

http.createServer(function (request, response) {
  console.log(‘request come‘, request.url)

  if (request.url === ‘/‘) {
    const html = fs.readFileSync(‘test.html‘, ‘utf8‘)
    response.writeHead(200, {
      ‘Content-Type‘: ‘text/html‘
    })
    response.end(html)
  }

  if (request.url === ‘/script.js‘) {
    response.writeHead(200, {
      ‘Content-Type‘: ‘text/javascript‘,
      ‘Cache-Control‘: ‘max-age=200‘
    })
    response.end(‘console.log("script loaded")‘)
  }
}).listen(8888)

console.log(‘server listening on 8888‘)