Skip to content

浏览器

1、浏览器缓存

浏览器缓存是浏览器在本地磁盘对用户最近请求过的资源进行存储,这样,当用户再次访问同一页面时,浏览器就可以从本地磁盘加载文档。

浏览器缓存主要分为强缓存(也称本地缓存)和协商缓存(也称弱缓存)。

  • 强缓存

    当请求资源时,如果是之前请求过的并使用强缓存,那么在过期时间内将**不会发送本次请求向服务器获取资源,而是直接从浏览器缓存中获取(无论资源是否改动)。过期了就重新从服务器获取,并再次强缓存。

  • 协商缓存

    当请求资源时,如果是之前请求过的并使用协商缓存,还是会发送请求到服务器,服务器会判断资源有没有被修改。没有修改的话会返回304 状态码,那么本次的资源则是从缓存中获取;若是资源被修改了,服务器会重新发送资源给客户端,并由客户端更新缓存。

强缓存

强缓存是利用http 头中的ExpiresCache-Control 两个字段来控制的,Expires 是http1.0 的规范,Cache-Control 是在http1.1 中出现的。

Cache-Control 有一些常设置的值:

  • private:仅浏览器可以缓存(默认值);
  • public:浏览器和代理服务器都可以缓存;
  • max-age=xxx:过期时间单位秒;
  • no-cache:不进行强缓存;
  • no-store: 不强缓存,也不协商缓存;

协商缓存

主要涉及到两组header 字段:

  • EtagIf-None-Match

    它们返回一个校验码。Etag 可以保证每一个资源是唯一的,资源变化都会导致Etag 变化。服务器根据浏览器发送的If-None-Match 值来判断是否缓存。当服务器返回304 Not Modified 状态码时,由于Etag 重新生成过,响应头也会返回这个Etag,即使这个Etag 与之前相比并没有变化。

  • Last-Modifyif-modified-since

    当浏览器第一次请求一个资源的时候,服务器返回的header 中会加上Last-Modify(时间标识,表示该资源的最后修改时间),如Last-Modify: Thu,31 Dec 2022 12:12:12 GMT

    当浏览器再次请求该资源时,请求头会包含if-modified-since,该值为缓存之前浏览器返回的Last-Modify。服务器收到if-modified-since 后,根据资源的最后修改时间判断是否缓存。

    如果要缓存,就返回304,并且不会返回资源内容,也不会返回Last-Modify