关于静态资源缓存的配置,主要是后端开发的工做,前端开发的同窗确定都有必定的了解但并不深刻。前端
今天咱们就来全面的梳理一下静态资源缓存:nginx
首先仍是从一个小故事开始:小c同窗是一名前端程序猿,负责公司门户网站的维护。这一天,他的大boss丢给他一张5M的大图,让他放到网站的首页。 这么大的资源,若是每次用户打开网站以后都要从新从服务器请求一遍,必然形成用户加载速度的减慢和带宽的浪费。 因而咱们聪明的主人公想到了缓存的方法:把图片资源缓存到本地,下次须要这个资源的时候没必要请求网络资源,直接从缓存中读取。chrome
因而小c同窗又开启了敲代码之旅。。。后端
缓存存在于http的get请求中,浏览器能够根据request和response的header中字段的值、客户端时间等,智能地判断使用本地存储的内容仍是服务端返回的内容。浏览器
其中,强缓存又分为两种:磁盘缓存disk cache和内存缓存memory cache缓存
首次请求服务器
Expires:绝对过时时间 设置一个绝对过时时间Date字符串, 优先级比Cache-Control低, 同时设置Expires和Cache-Control则后者生效. 这种方式有一个明显的缺点,因为失效时间是一个绝对时间,因此当客户端本地时间被修改之后,服务器与客户端时间误差变大之后,就会致使缓存混乱。网络
Cache-Control:设置相对过时时间,以秒为单位,始终与客户端时间相比较。分布式
no-cache: 数据内容不能被缓存, 每次请求都从新访问服务器,如有max-age, 则缓存期间不访问服务器.优化
no-store: 不只不能缓存, 连暂存也不能够(即: 临时文件夹中不能暂存该资源)
private(默认): 只能在浏览器中缓存, 只有在第一次请求的时候才访问服务器, 如有max-age, 则缓存期间不访问服务器
public: 能够被任何缓存区缓存, 如: 浏览器、服务器、代理服务器等
max-age: 相对过时时间, 即以秒为单位的缓存时间
Etag ETag将返回给浏览器一个资源ID(字符串), 若是有了新版本则正常发送并附上新ID, 不然返回304. ETag是为了解决Last-Modified只能精确到秒的问题,能够精确到毫秒。可是在服务器集群状况下, 必须保证每一个分布式服务器返回相同的ETag.
Last-Modified: 该资源的最后修改时间, 在浏览器下一次请求资源时, 浏览器将先发送一个请求到服务器上, 并附上If-odified-Since头来讲明浏览器所缓存资源的最后修改时间, 若是服务器发现没有修改, 则直接返回304(Not Modified)回应信息给浏览器(内容不多), 若是服务器对比时间发现修改了, 则照常返回所请求的资源.
资源缓存在用户的电脑上,浏览器目录中。mac os系统,chrome浏览器的缓存存储位置是:/Users/XXX/Library/Caches/Google/Chrome/Default/Cache,默认缓存文件没有后缀名,咱们能够手动添加后缀名
效果:
在服务端的nginx中配置:
在服务器中配置 cache-control:no-store,禁止静态资源缓存
生产环境中,用户以前可能有200缓存,当资源有更改的时候,因为不能让用户手动清除缓存,可能出如今旧缓存有效期内,老用户显示缓存中内容的状况。 解决方法:把文件名和文件内容关联起来,好比js文件,每次修改文件内容后都关联的修改文件名称,强制用户使用新的文件,不使用缓存。
CDN回源 nginx相关配置 逐级优化字段 为什么递进