304状态码
304 状态码是 HTTP 协议中表示资源未发生变化的状态码,用于优化性能,减少带宽消耗。在处理 HTTP 请求时,服务器会通过判断资源的状态来决定是使用强缓存还是协商缓存。
强缓存
强缓存(也称为静态缓存)是指客户端在第一次请求资源时,服务器返回的响应中包含了缓存相关的头部信息,例如 Cache-Control 和 Expires。这些头部信息告诉客户端将资源缓存一段时间,并在缓存有效期内直接从缓存中获取资源,无需再向服务器发送请求。
协商缓存
协商缓存(也称为动态缓存)是指客户端在请求资源时,服务器会根据资源的状态生成一个唯一的标识符(例如 ETag 或 Last-Modified),并在响应头部中包含这个标识符。客户端在下一次请求资源时,会将这个标识符包含在请求中的条件请求头部(例如 If-None-Match 或 If-Modified-Since)中,发送给服务器。服务器通过比较这个标识符与资源的当前状态来判断资源是否发生了变化,如果资源未发生变化,则返回 304 状态码,告诉客户端可以使用缓存中的资源。
强缓存和协商缓存的特点
以下是强缓存和协商缓存的一些特点:
强缓存:
- 缓存有效期由服务器在响应头部中通过 Cache-Control 和 Expires
设置,客户端可以直接从缓存中获取资源,无需再向服务器发送请求。 - 如果缓存有效期内,客户端直接从缓存中获取资源,不与服务器进行通信,从而减少了网络传输和服务器负载。
- 缓存有效期过期后,客户端需要重新向服务器请求资源。
协商缓存:
- 缓存的有效期由服务器在响应头部中通过 Cache-Control 和 Expires 设置,但同时也会返回一个唯一的标识符,例如 ETag 或 Last-Modified。
- 客户端在下一次请求资源时,会将这个标识符包含在条件请求头部中,如果资源未发生变化,则服务器返回 304 状态码,告诉客户端可以使用缓存中的资源。
- 如果资源发生了变化,服务器会返回新的资源,并更新缓存的标识符。
在实际的 Web 开发中,可以根据不同的场景和需求来选择使用强缓存或协商缓存。强缓存适用于资源较为稳定不经常变化的情况,可以减少与服务器的通信和带宽消耗;而协商缓存适用于资源可能会频繁变化的情况,可以通过条件请求来判断资源是否发生了变化,从而避免不必要的资源