缓存头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‘)