强缓存和协商缓存是Web开发中两种主要的缓存机制,用于提高网页加载速度,减少服务器负载。下面分别介绍这两种缓存机制:
-
强缓存:
- 强缓存通过设置HTTP响应头中的
Expires或Cache-Control来控制。当浏览器请求资源时,服务器会在响应头中指定一个过期时间。 - 如果资源在设定的时间内没有过期,那么浏览器会直接从本地缓存中读取资源,不会向服务器发送请求。
- 使用
Cache-Control比Expires更灵活,因为它不依赖于服务器时间。
- 强缓存通过设置HTTP响应头中的
-
协商缓存:
- 协商缓存通过
ETag或Last-Modified与If-None-Match或If-Modified-Since配合使用来实现。 - 当浏览器首次请求资源时,服务器会在响应头中返回资源的版本号(
ETag)或最后修改时间(Last-Modified)。 - 下次请求同一资源时,浏览器会在请求头中带上之前获取到的版本号或最后修改时间,服务器根据这些信息判断资源是否发生变化。
- 如果资源未改变,服务器将返回304状态码而不是整个资源内容;如果资源已改变,则返回新的资源内容。
- 协商缓存通过
结合使用这两种缓存策略可以有效提升用户体验,同时减轻服务器压力。 配置强缓存和协商缓存主要是通过HTTP响应头来完成的。以下是具体的配置方法:
强缓存
强缓存通常使用Cache-Control或Expires来控制。Cache-Control是HTTP/1.1协议的一部分,而Expires是HTTP/1.0的特性,但在现代浏览器中仍然支持。
-
Cache-Control: 这个头字段可以设置多个指令,例如
max-age定义了资源在多长时间内可以被缓存。示例配置如下:http Cache-Control: max-age=3600这表示资源可以在客户端缓存一个小时。
-
Expires: 这个头字段指定了一个绝对的时间点之后,资源将不再被认为是新鲜的。示例配置如下:
http Expires: Thu, 01 Jan 2025 00:00:00 GMT这表示资源直到2025年的1月1日午夜前都是有效的。
协商缓存
协商缓存通常使用ETag或Last-Modified来实现。
-
ETag:
ETag是一个标识资源版本的唯一标识符。服务器返回一个ETag值给客户端,下次请求时客户端会发送一个If-None-Match头来验证资源是否已更改。示例配置如下:http ETag: "123456789abcdef"客户端再次请求时:
http If-None-Match: "123456789abcdef" -
Last-Modified:
Last-Modified指示资源最后一次被修改的时间。客户端在再次请求资源时会发送一个If-Modified-Since头来检查资源是否自上次请求后被修改。示例配置如下:http Last-Modified: Tue, 15 Nov 2022 12:45:26 GMT客户端再次请求时:
http If-Modified-Since: Tue, 15 Nov 2022 12:45:26 GMT
实际应用中的配置
在实际的应用中,你可以使用服务器配置文件或者编程语言中的HTTP库来设置这些头部。例如,在Node.js中使用Express框架,你可以这样设置:
const express = require('express');
const app = express();
const ONE_HOUR = 3600 * 1000;
app.use((req, res, next) => {
// 设置强缓存
res.setHeader('Cache-Control', `public, max-age=${ONE_HOUR}`);
// 设置协商缓存
const etag = '123456789abcdef';
res.setHeader('ETag', etag);
next();
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
以上示例展示了如何在Express应用中设置强缓存和协商缓存。根据实际情况调整缓存时间和其他参数。