HTTP缓存与header模块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP缓存与header模块相关的知识,希望对你有一定的参考价值。

参考技术A HTTP缓存分为缓存控制和缓存校验,缓存控制有Cache-Control和Pragma

Pragma是旧产物,已经逐步抛弃,有些网站为了向下兼容还保留了这两个字段。如果一个报文中同时出现Pragma和Cache-Control时,以Pragma为准。同时出现Cache-Control和Expires时,以Cache-Control为准。即优先级从高到低是 Pragma -> Cache-Control -> Expires

如果在请求header有如下参数

则Pragma的优先级更高

Cache-Control一般值为

缓存校验有Last-Modified和ETag

如果请求Cache-Control值为max-age=0,表示客户端要去服务端做资源校验,校验通过会发生304,使用本地缓存的资源,校验不通过的话,服务端将数据返回给客户端

服务端在响应时候会有响应头Last-Modified,这是一个格林威治时间,表示资源最后的修改时间

客户端在刷新页面时候,会发一个请求头If-Modified-Since,表示收到的上一次服务端给的Last-Modified

当服务端会对比自己的Last-Modifed和客户端的If-Modified-Since,如果

If-Modified-Since >= Last-Modifed

那么服务端会直接响应304,响应body体长度为0,以下为一个304响应的nginx-access日志

但是Last-Modifed无法解决资源在一秒内连续修改的问题,一秒内连续修改后,客户端只会更新一次

更好的解决方法是ETag,服务器会响应一个根据资源算出来的字符,如

第二次客户端请求时候会携带If-None-Match请求头

如果

If-None-Match == ETag

表示资源没有修改,服务端响应304

如果同时有ETag和Last-Modify,则ETag的优先级会更高

但是ETag也有问题,如果服务端是多节点集群,那么有可能A节点算出来的ETag和B节点的ETag可能不同,造成无法正常304响应,在nginx中可以关闭ETag

200状态码会发生于浏览器第一次加载页面、强制刷新、304校验失败、资源缓存过期、浏览器禁用缓存情况

如果是浏览器第一次加载,那么请求头不会有 Cache-Control 、 If-None-Match 、 If-Modified-Since

服务端正常响应200,正常将数据传给客户端

如果是强制刷新,那么浏览器会强制加请求头

表示需要服务端响应真实数据,不用做校验

如果浏览器禁用了缓存Disable Cache,那么也会强制加请求头no-cache

304状态码会发生于刷新页面情况

刷新情况浏览器会强制加请求头

表示需要浏览器校验,校验成功就是304,校验失败就是200

发生过程

由于访问静态资源,服务端通常都会响应Cache-Control:max-age,表示需要客户端缓存这个静态资源多长时间,如

同一个浏览器新窗口再次访问会发生from disk cache

from disk cache情况服务端不会收到请求

响应码为 200 , 201 , 206 , 301 , 302 , 303 , 307 , 308 情况下会发这个响应头
参数可以是正数或者负数,如果为负,则发送的头为

可以配置max,这样响应的就是,可以认为是永久缓存

off参数可以禁用添加或者修改expire和Cache-Control响应

响应码为200、201、204、206、301、302、303、304、307、308则添加指定的响应头
如果当前级别没有add_header,则从上一个级别继承,仅仅当前级别没有的话
如果定义了always,则不管响应码为多少都添加header

以上是关于HTTP缓存与header模块的主要内容,如果未能解决你的问题,请参考以下文章

通过HTTP Header控制缓存

HTTP缓存

通过HTTP Header控制缓存

HTTP缓存机制及原理

简述HTTP协议报文首部缓存机制

nginx缓存和自定义header