在 Web 应用中,协商缓存机制能有效提升性能,减少不必要的数据传输,其工作流程如下:
客户端向服务端发起请求时,服务端会校验请求中是否携带特定标识,该标识用于判断缓存资源是否过期。若没有标识,表明这是第一次请求,服务端会生成标识并返回给客户端。此后,客户端再次请求相同资源时,会将该标识一同发送到服务端。
服务端接收到请求后,对比所携带的标识。若与服务器记录的一致,说明缓存命中,服务器会返回 304 状态码,告知浏览器直接复用本地缓存数据;若对比不通过,则意味着资源已被修改,服务器将返回 200 状态码,并发送最新的资源给浏览器,实现数据更新。
目前有两种常见的标识方式:
- last - modified/if - modified - since:服务端通过响应头中的
last-modified
字段返回 GMT 时间格式的字符串,代表资源的最后修改时间。客户端再次请求时,会在请求头中添加if-modified-since
字段,其值为之前接收到的last-modified
值。服务端对比这两个值,若相同则复用缓存,不同则返回最新资源。 - etag/if - none - match:服务端在响应头中通过
etag
字段返回资源的唯一标识符。客户端后续请求时,会在请求头中添加if-none-match
字段,其值为之前的etag
。服务端对比两者,一致则复用缓存。etag
的优先级高于last-modified
,能更精准地判断资源是否变化。
需要注意区分的是,expires
属于强缓存,是后端在响应头中配置的值,与协商缓存的工作机制不同 。