饥人谷技术博客Http

HTTP-缓存控制

2019-03-13  本文已影响87人  学的会的前端

静态服务器(无缓存无更新请求数据)

有缓存-无更新请求数据

缓存作用:

缓存是指代理服务器或客户端本地磁盘内保存的资源副本,利用缓存可减少对源服务器的访问,可以节省通信流量和通信时间。

有缓存有更新请求数据

有缓存+更新机制升级版

Cache-Control: max-age=300;

以上代码代表时间间隔,如果再一次的请求在时间间隔300s之内,就在缓存中获取,否则从服务器获取。

缓存+更新终极版

服务器返回的文件以及额外信息,其中Etag 是 对请求文件的编码,如果请求文件在服务端未被修改,这个值就不会变。

Cache-Control: max-age=300;
ETag:W/"e-cbxLFQW5zapn79tQwb/g6Q"

当超过时间间隔的时候,重新发请求获取源文件的时候,在发送请求的时候附带刚刚保存的文件的ETag ( If-None-Match:W/"e-cbxLFQW5zapn79tQwb/g6Q"),之后于ETag进行比较,如果二者相等,则发送个短消息(响应头,不包含图片内容, 304),如果二者不等则发送新文件和新的 ETag,浏览器获取新文件并更新该文件的 Etag。(浏览器的默认行为。)

与 ETag 类似功能的是Last-Modified/If-Modified-Since。当资源过期时(max-age超时),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示上次服务器告知的文件修改的时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(200);若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 ,告知浏览器继续使用所保存的cache。第一次去请求,响应头中存在Last-modified,刷新后第二次请求,请求头中有if-modified-since。

.html不会缓存,.css和图片都会

原因:图片和CSS的请求都是HTML到达浏览器后,浏览器解析发出的,而HTML是直接输入URL解析出来的。报文也存在差异:


htmlq请求报文.PNG
css报文.PNG

lastModified和cache-control

Cache-Control: no-cache
LastModified:sXXX

可以进行缓存,但是下一次请求之前,不可以直接在缓存中拿数据,要先问服务器是否可以在本地缓存中中拿,如果服务器返回304状态码,则表示可以在本地缓存中拿数据,否则,服务器返回数据。

小结:

  1. 在互联网上,域名通过DNS服务映射到IP地址之后访问目标网站,也就是说,当请求到达服务器时,已经是已IP地址形式访问了。
  2. 代理:是一种具有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。代理不会改变请求URI。每次通过代理服务器转发请求或者响应的时候,会追加写入Via首部信息。GET/HTTP/1.1 Via:proxy1
    • 缓存代理(利用缓存技术);
    • 透明代理,不对报文做任何加工的代理叫透明代理。
  3. 网关:是转发其他服务器通信数据的服务器,接收从客户端发来的请求时,它就像自己拥有资源的服务器一样,对请求进行处理。利用网关可以由HTTP请求转化为其他协议通信。
  4. 隧道:是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。隧道的目的是确保客户端能与服务器进行安全的通信,本身 不会去解析HTTP请求,请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。
  5. 需要兼容HTTP1.0的时候需要使用Expires,不然可以考虑直接使用Cache-Control
  6. 需要处理一秒内多次修改的情况,或者其他Last-Modified处理不了的情况,才使用ETag,否则使用Last-Modified。
  7. 对于所有可缓存资源,需要指定一个Expires或Cache-Control,同时指定Last-Modified或者Etag。
  8. 可以通过标识文件版本名、加长缓存时间的方式来减少304响应。

学习资料参考:HTTP缓存控制小结

上一篇 下一篇

猜你喜欢

热点阅读