HTTP缓存 - If-Modified-Since与Last-Modified

作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!

当浏览器本地缓存的数据已经过期或无法判断是否为最新版本,就会向服务器发起请求进行核对,常见的是Last-ModifiedIf-Modified-Since结合使用。

  • 如果自指定的时间之后,文档发生了变化,就返回文档内容和新的修改时间,浏览器用新的数据覆盖本地缓存。
  • 如果文档没有变化,返回304 Not Modified,只返回一些需要在浏览器中更新的Header信息。

注:一些WEB服务器在实现时,只是比较If-Modified-Since与文档的修改时间是否一致,并没有确认是否在这个时间之后修改过。

实例

首次请求与响应

1)浏览器首次访问时,请求的Header中没有If-Modified-Since。
2)响应状态码为200,响应的Header中返回了Last-Modified并完整地返回了文件内容。
首次请求与响应

本地有缓存,文档在服务器未修改

1)浏览器再次访问,请求的Header携带了If-Modified-Since,其值为上次响应的Last-Modified的时间。
2)此文件没有修改过,服务器返回响应状态码为304,响应的Body为空。
本地有缓存,文档在服务器未修改

本地有缓存,文档在服务器有修改

1)在服务器修改文件。
2)浏览器的请求的Header携带If-Modified-Since。
3)由于文件已修改并且比If-Modified-Since的时间新,因此响应状态码为200,返回文件内容并在响应的Header中返回了Last-Modified,其值为文件的最新修改时间。
本地有缓存,文档在服务器有修改