对于前端而言,缓存是改善前端性能,提升用户体验等的一个很重要的手段,适当的缓存可以极大的缓解服务器的压力。
重定向是永久的,表示的是原有的 URL 不能再被使用,而应该选择用新的 URL。
编码 | 含义 | 处理方法 | 应用场景 |
---|---|---|---|
301 | Moved Permanently | get 方法不会变更,其他方法可能会变更成 get 方法 | 网站重构 |
308 | Permanently Redirect | 方法和消息主体都不发生变化 | 网站重构,用于非 get 方法 |
http 304 未改变说明无需再次传输请求的内容,也就是可以使用缓存的内容,这通常是在一些安全的方法或者
缓存有很多种,但是对于前端来说 HTTP 缓存无疑是非常重要的一种,是需要优先掌握的
HTTP 缓存分为强缓存和协商缓存,优先级较高的是强缓存,在命中强缓存失败的时候,才会走协商缓存。
强缓存是利用 http 头中的 Expires 和 Cache-control 两个字段进行控制的。当请求再次发出的时候,浏览器会根据其中的 expires 和 cache-control 去判断是不是命中了强缓存,如果是命中了,就不再和浏览器发生交互。直接去缓存中获取资源。
在强缓存中有两个关键字,分别是 expires 和 cache-control 。
expires:后面是一个 date 时间日期。表示资源的到期日期,但是这个东西有个问题就是本地的时间可能和服务器不一样,或者可以把本地的时间手动改掉,这样的话就不是我们想要的准确的对比结果了。有一定的局限性。
Cache-control:35000 number 类型,代表的是多少秒。这样的话就可以和服务器很准确的去交互,判断资源是不是过期了。
但是在 cache-control 里不仅仅有 max-age,还有 s-maxage,s-maxage 的优先级高于 max-age
cache-control: max-age=3600, s-maxage=31536000 public private no-cache, no-store,
s-maxage 表示 cache 在代理服务器上的缓存有效时间,且只对 public 缓存生效,对于比较大的架构,一定存在 CDN 这样的静态资源服务器,那么就存在服务器的资源缓存有效时间,那么 s-maxage 就是给这个准备的。这时候会出现 public 和 private 的概念,public 可以被代理服务器缓存也可以被浏览器缓存,但是 private 就只可以被浏览器缓存。
no-cache : 设置了 no-cache 的时候,就会在每次发起请求前,绕开浏览器直接去服务器确认该资源是不是过期,走的是协商缓存的路线。 no-store : 设置了 no-store 的时候,就会是每次请求不使用任何的缓存策略,直接去服务器请求完整的资源。 no-store 的优先级最高。
协商缓存是浏览器和服务器之间协作下的缓存机制,协商缓存机制依赖浏览器和服务器之间的通信,在协商缓存机制下,浏览器会向服务器询问缓存的信息,进而判断是不是要发起请求或者是去本地获取缓存信息。在协商缓存中有两个比较重要的点就是 Last-modify 和 E-tag
Last-modify :通过服务器上文件修改的时间戳和当前请求的时候 HTTP 头信息中携带的 Last-modify 做对比,看是不是一致,如果两者的时间是不一致的,那么就会发起请求。但是这个 Last-modify 有个问题就是他不是很准确,存在这样的情况,当我们修改了文件,但是没有修改文件的内容,这时候,服务器上的文件时间会发生变化,Last-modify 和服务器上的时间不一致,会发起请求,这不是我们想要的,再有就是 Last-modify 时间是秒为单位的,如果在 100ms 内修改了文件,请求的时候,Last-modify 和服务器上的时间是一样的,这时候会拿不到最新的文件。这是弊端 E-tag:E-tag 的出现是为了解决上面提及的那两个弊端,当文件修改了以后,E-tag 就会发生变化,这时候就会触发一次完整的请求。E-tag 虽然好,但是它会消耗服务器的性能,所以 last-modify 和 E-tag 是要根据业务去判断应该用那个。
一般大型的 web 架构静态资源走 CDN 是一个规定,CDN 的核心功能点有两个,一个是回源,一个是缓存
回源:CDN 服务器发现自己这里没有客户端请求的这个静态资源,就会去找根节点请求这个资源。 缓存:将回源得到的静态资源存放在自己服务器上。
利用 CDN 有很多好处,节省服务器资源,加快静态资源下发给客户端,增强客户体验,让客户可以更快的拿到资源。性能优化等