http 缓存整理

1 正向代理与方向代理
正向代理: 代理客户端请求,如 请求goggle被拒绝,可以搭建一个代理服务器,再转向 谷歌
反向代理: 代理服务端,如ngix,指向代理服务器后,转发到其他的服务器


2 缓存
缓存网络资源,当请求的资源被缓存后,可以拦截请求,返回资源的拷贝,用来缓解服务器压力,提升性能。
大致分为私有与共享缓存

私有缓存(浏览器缓存)
浏览缓存拥有用户通过http下载的所有文档,可以避免网页向服务器发起多余的请求。同样可以提供缓存内同的离线浏览。
代码缓存可被多个用户使用,比如可以假设一个 web代理作为本地网络基础的一部分提供给用户,这样热门资源会被重复使用,
减少网络拥堵与延迟

虽然http缓存不是必须的,但重用缓存的资源是必须的,
常规的http缓存只能存储get,对于其他类型的响应则无能为力,缓存的关键主要包括request method和目标URL
常规缓存的目标:
GET-200- 包含HTML文档,图谱或者文件的响应
永久重定向-301
错误响应 404的页面
206-只返回局部的信息

缓存控制
http1.1定义的cache-control
禁止进行缓存
Cache-control:no-store; 禁止进行缓存,缓存不得存储任何关于客户端请求和服务端响应的内容,每次客户端发起的请求都会被下载完整的响应内容。

强制确认缓存
Cache-control:no-cache; 每次请求发出时,缓存会将此请求发到服务器,服务器端会验证请求中所描述的缓存是否过期,若未过期则返回304,则缓存
才使用本地缓存副本
私有缓存与公共缓存
Cache-control:public; 表示响应可以被任何中间人如CDN,中间代理,缓存
Cache-control:private; 表示响应专用与某单个用户,改响应只能应用于浏览器私有缓存中

缓存过期机制
Cache-control: max-age=xxx; 表示资源能被缓存的最大时间,相对我=Expire而言,max-age是距离请求发起的时间的秒数。针对
应用中哪些不会改变的文件,通常可以手动设置一定的时长以保证缓存有效,例如css 图片等

缓存验证确认
Cache-control: must-revalidate 意味着缓存在考虑使用一个陈旧的资源时,必须验证她的状态,已过期的缓存将不被使用

缓存驱逐
缓存只有有限的空间存储资源副本,所以缓存会定期的将一些副本删除,这个过程叫缓存驱逐,当服务器上的资源进行了更新,那么缓存的资源也应该被更新,
但是不可能直接通知客户端进行更新缓存,所以双方必须为该资源约定一个过期时间,在该时间之前资源就是新鲜的,过了时间之后资源就是陈旧的,
驱逐算法用于将陈旧的资源变成新鲜的资源,一个陈旧的资源是不会直接被清除或忽略的,当客户端发起请求后,缓存检索到已有一个对应的陈旧资源,则
缓存会先将此请求附加一个IF-None-Match,然后发给目标服务器,一次来检查该资源副本是否还是新鲜的,若服务器返回304(NOT-Modified)(该响应
不会带有试题信息),则表示该资源副本是新鲜的,这样一来,可以节省一些宽带,若服务端通过If-None-Match或If-Modified-Since判断后发现已过期,
那么会带有实体内容返回。

对于含有特定信息的请求,会计算缓存寿命,比如Cache-control: max-age=N,相应的缓存的寿命就是N,通常情况下,对于不含这个属性的则会去查看
是否包含Expires属性,通过比较Expires和头里面的Date属性的值判断是否缓存有效,如果max-age和expires属性都没有,找找头里面的Last-Modified
如果有吗,缓存的寿命就是头里面Date的值减去Last-Modified的值除以10,

缓存验证
用户点击刷新按钮是会触发验证,如果换缓存的响应头信息含有Cache-control:must-revalidate,那么在浏览的过程中也会触发缓存验证,
当缓存的文档过期后,需要进行缓存验证或者重新获取资源,只有服务器返回强校验或者弱校验时候才会验证

ETags
作为缓存的一种强强校验器,如果资源请求的响应头含有ETag,客户端就可以在后续的请求头中带上If-None-Match头来验证缓存。

Last-Modified响应头可以作为一种弱校验器,说他弱是因为他只能精确到一秒。如果响应头里包含这个信息,客户端可以再后续的请求上
带上If-Modified-Since来验证缓存

当服务端发起缓存校验请求时,服务端返回200或者304 表示浏览器可以使用本地缓存,304的响应头可以同时更新缓存文件的过期时间

待Vary头的响应
当缓存服务器收到一个请求,只有当前的请求和原始缓存的请求头跟缓存的响应头里面的Vary都匹配的时候,才能使用缓存的响应
如Vary:User-Agent 因为移动端与桌面的客户端请求头UA不一样,缓存服务器不会错误的把移动端的内容输入到桌面端到用户

这篇文章推荐一下 https://www.cnblogs.com/chenqf/p/6386163.html

原文地址:https://www.cnblogs.com/lisiyang/p/11771306.html