当前位置 : 主页 > 网络编程 > 其它编程 >

HTTP控制缓存

来源:互联网 收集:自由互联 发布时间:2023-07-02
一、HTTP请求和响应结构简图1.请求一般分为三部分请求行、请求头和请求体但是要注意请求头和请求体之间的空行也是HTTP请求规范内容。请求行分为三部 一、HTTP请求和响应结构简图
一、HTTP请求和响应结构简图1.请求一般分为三部分请求行、请求头和请求体但是要注意请求头和请求体之间的空行也是HTTP请求规范内容。请求行分为三部
  • 一、HTTP请求和响应结构简图
1. 请求一般分为三部分请求行、请求头和请求体但是要注意请求头和请求体之间的空行也是HTTP请求规范内容。请求行分为三部分方法、资源路径和协议版本。

2. 响应

通常也分为三部分响应行、响应头和响应体响应头和响应体直接的空行也是HTTP的规范。响应行也分为三部分协议版本状态码和状态码描述。

二、再验证和新鲜度检测

web缓存可以自动保存常见文档副本当web请求抵达时如果本地有“已缓存”的副本则【可以】可以意味着并不是一定都会从缓存中获取资源这和再验证、新鲜度有关直接从缓存读取而不是从原始的服务器中查找资源。

新鲜度【缓存】会将服务器响应的资源缓存一段时间在这段时间内都认为该资源是“新鲜”的当有新的请求需要该资源时缓存在可以不访问原始服务器的情况下直接提供该资源。目前web缓存存在多级缓存结构不只是浏览器会有本地私有缓存类似CDN服务器等也会有公共代理缓存

再验证当缓存一个副本的时间超过了新鲜度限值就认为该对象过时了当新的请求访问该资源时缓存需要再次和服务器进行确认查看该文档是否被修改产生了变化如果无变化则更新新鲜度值从缓存中返回该资源。

三、过程

1. 缓存接收请求

2. 缓存解析请求对请求报文进行解析提取URL和各种首部

3. 查询缓存查询是否有本地缓存如果没有则请求原始服务器从响应中保存一份副本返回200的状态码和last-modifiedDate的响应头表示该资源最近修改的时间

4. 新鲜度检测如果有缓存则进行新鲜度检测如果副本没有过期则返回缓存副本如果副本过期则进行【再验证】询问服务器该资源是否过期通过HTTP请求头if-modified-since携带文档的修改日期到服务器服务器会进行比对如果资源没被修改则返回304not modified由缓存直接响应请求如果资源被修改过了则由服务器返回相应响应码200接着缓存考本新的资源覆盖旧的资源返回客户端响应资源

5. 创建响应调整服务器端的的响应以匹配客户端例如客户端是HTTP1.0的协议服务器端的是HTTP1.1的协议则缓存可以做一些调整使两者匹配

6. 发送响应

7. 记录日志

四、HTTP协议中的控制缓存

通过响应来控制缓存在响应头中主要有cache-control、pragma、expires三个响应头其中expires是HTTP1.0中的响应头后面直接跟一个缓存失效日期但是服务器和客户端之间的时钟往往不同因此通过该响应头来控制缓存失效时间不准确一般不用如果要设置客户端不缓存则设置响应头“expires: -1”即可pragema是HTTP1.1协议为了兼容HTTP1.0协议用来控制不缓存“pragma: no-cache"cache-control是HTTP1.1中的响应头其参数为相对的秒值即过多少秒缓存失效因此建议使用该响应头来控制缓存失效时间其后可以跟的内容有no-cache、no-store、max-age、must-revalidate

为了兼容各个协议版本要想客户端不缓存资源一般都添加三个响应头cache-control: no-cache、pragma: no-cache、expires: -1

注意cache-control: no-cache控制缓存客户端是会缓存资源的只是在于原始服务器进行再验证之前不会想客户端提供资源也就是资源新鲜度永远过期这样比直接访问服务器节省了资源在网络中的传输成本相比开启缓存增加了再验证的成本性能失效介于两者之间要想客户端缓存不从响应中拷贝资源副本则应该使用cache-control: no-store使用该响应头内容也可以让缓存立即删除已经拷贝的副本而must-revalidate是服务器希望缓存能严格遵守过期信息一般情况下类似no-cache但在缓存与原始服务器进行新鲜度验证的时候原始服务器不可用这将会导致这一段时间中访问该资源会504 gateway timeout因此建议使用no-cache

上一篇:ORA01102解决思路
下一篇:没有了
网友评论