HTTP的If-Modified-Since头部是用于缓存控制的一种机制,它主要用于告知服务器浏览器缓存中缓存的资源的最后修改时间。当浏览器发起对该资源的请求时,如果该资源的最后修改时间和If-Modified-Since头部所包含的时间戳一致,那么服务器就不会返回该资源的新内容,而是返回304 Not Modified状态,告知浏览器使用本地缓存。
If-Modified-Since头部传递的时间戳格式为RFC 1123标准中定义的时间格式,例如Mon, 17 Jul 2017 15:10:24 GMT。以下是If-Modified-Since头部的基本使用方法:
GET /index.html HTTP/1.1
Host: www.example.com
If-Modified-Since: Mon, 17 Jul 2017 00:00:00 GMT
以下是使用If-Modified-Since头部的两个示例:
示例1:缓存资源有更新
假设我们有一个图片资源,其URL为http://www.example.com/image.jpg
,我们使用If-Modified-Since头部来告知服务器我们缓存资源的最后修改时间:
GET /image.jpg HTTP/1.1
Host: www.example.com
If-Modified-Since: Mon, 17 Jul 2017 00:00:00 GMT
当我们在之后发起请求时,如果该资源的最后修改时间早于If-Modified-Since头部所包含的时间戳(比如说,时间戳为 Mon, 17 Jul 2017 15:10:24 GMT
,而最后修改时间为 Mon, 17 Jul 2017 09:30:00 GMT
),服务器就会返回该资源的新内容,状态码为200 OK。
示例2:缓存资源无更新
继续使用上面那个图片资源,如果我们在之后再次发起请求时,该资源的最后修改时间晚于或等于If-Modified-Since头部所包含的时间戳(比如说,时间戳为 Mon, 17 Jul 2017 15:10:24 GMT
,而最后修改时间为 Mon, 17 Jul 2017 15:09:00 GMT
),服务器就会返回304 Not Modified状态,告知浏览器使用本地缓存:
GET /image.jpg HTTP/1.1
Host: www.example.com
If-Modified-Since: Mon, 17 Jul 2017 15:10:24 GMT
通过使用If-Modified-Since头部,服务器可以避免重复传输未修改的资源,从而减少网络带宽的消耗,加快网页的加载速度。此外,使用If-Modified-Since头部还可以减少服务器的负担,提升网站的整体性能。