什么是HTTP缓存
当你打开一个网页,比如常看的新闻站或者购物平台,第二次再进的时候往往比第一次快很多。这背后很大一部分功劳要归功于HTTP缓存机制。简单来说,HTTP缓存就是浏览器把之前下载过的资源(比如图片、CSS、JS文件)存下来,下次访问时直接用本地的副本,不用重新从服务器拉取。
这种机制不仅能加快页面加载速度,还能减少网络流量消耗,减轻服务器压力。尤其在移动端,省流量又提速,用户体验自然更好。
缓存的基本流程
浏览器发起请求时,会先检查本地是否已有该资源的缓存。如果有,并且还没过期,就直接使用;如果已过期,就会带着缓存信息去问服务器:我手里的版本还有效吗?服务器根据情况决定是让浏览器继续用旧的,还是发一个新的过来。
这个过程听起来像“先斩后奏”,其实是HTTP协议设计的聪明之处——尽量减少网络往返,提升效率。
强缓存:不用问服务器
强缓存的特点是,浏览器完全不需要跟服务器通信,直接使用本地缓存。判断依据是响应头中的两个字段:Expires 和 Cache-Control。
Expires 是HTTP/1.0的产物,指定一个绝对时间,比如:
Expires: Wed, 05 Mar 2025 08:00:00 GMT意思是这个资源在这之前都有效。但问题在于它依赖客户端时间,如果用户电脑时间不准,缓存策略就可能出错。
所以后来有了更可靠的 Cache-Control,它是HTTP/1.1的标准。常见写法:
Cache-Control: max-age=3600表示资源在3600秒内都是有效的,相对时间,不受客户端时间影响。还可以组合使用,比如:
Cache-Control: public, max-age=86400说明可以被代理服务器缓存,有效期一天。
协商缓存:问问服务器同不同意
当强缓存失效后,浏览器不会立刻下载新资源,而是先问问服务器:“我这有个旧版本,还能用吗?”这就是协商缓存。
服务器通过对比资源是否有变化来决定返回304(没变,继续用)还是200(有更新,发新内容)。这里依赖两个关键头部字段:Last-Modified 和 ETag。
使用 Last-Modified 时,服务器在首次响应中告诉浏览器资源最后修改时间:
Last-Modified: Tue, 04 Mar 2025 10:00:00 GMT下次请求时,浏览器带上:
If-Modified-Since: Tue, 04 Mar 2025 10:00:00 GMT服务器对比后发现没变,就返回304,节省传输。
但 Last-Modified 精度只能到秒,且有些文件修改时间变了但内容没变,这时候就轮到 ETag 出场了。ETag 是服务器为资源生成的一个唯一标识,比如文件的哈希值:
ETag: "abc123"浏览器再次请求时发送:
If-None-Match: "abc123"服务器比对后决定是否返回新内容。相比 Last-Modified,ETag 更精确,能应对内容未变但时间戳变动的情况。
缓存策略的实际应用
在实际开发中,静态资源通常设置较长的强缓存时间,比如:
Cache-Control: max-age=31536000同时在文件名中加入哈希值,如 app.a1b2c3d.js。这样一旦文件内容变了,URL也就变了,自然触发新缓存,避免旧缓存导致更新不及时。
而对于HTML文件,一般不设强缓存,或设很短时间,确保用户每次都能拿到最新的页面结构。
合理配置缓存,能让网站加载更快,服务器更轻松。下次你刷网页感觉“嗖一下就开了”,很可能就是HTTP缓存在默默发力。