Nodejs中关于304 Expires的时间,Cache-Control:max-age=0的解释
Nodejs中关于304 Expires的时间,Cache-Control:max-age=0的解释
304 的 Expires
的时间有什么用?
Last-Modified
和 If-Modified-Since
去判断是不是 304?
浏览器请求头:Cache-Control:max-age=0
?
response 头:Cache-Control:max-age=1000
控制缓存时间?
Node.js 中关于 304、Expires 的时间,以及 Cache-Control: max-age=0 的解释
在 HTTP 协议中,304 Not Modified
状态码用于指示客户端可以使用其本地缓存的资源副本,而不是从服务器重新获取资源。这一机制通过减少不必要的网络传输来提高性能和减轻服务器负载。
Expires
时间的作用
Expires
是一个响应头字段,它指定了资源的过期时间。如果客户端的系统时间晚于 Expires
指定的时间,那么客户端会认为资源已过期,并向服务器发起新的请求以获取最新版本的资源。例如:
res.setHeader('Expires', new Date(Date.now() + 86400000).toUTCString()); // 设置过期时间为一天后
Last-Modified
和 If-Modified-Since
判断是否为 304
Last-Modified
响应头用于告诉客户端资源最后被修改的时间。当客户端再次请求同一个资源时,它会在请求头中包含 If-Modified-Since
字段,该字段的值为之前接收到的 Last-Modified
值。如果资源在这段时间内没有被修改,服务器将返回 304 Not Modified
,并且不返回任何响应体。
app.get('/resource', (req, res) => {
const lastModified = new Date(fs.statSync('path/to/resource').mtime).toUTCString();
res.setHeader('Last-Modified', lastModified);
if (req.headers['if-modified-since'] === lastModified) {
res.status(304).send(); // 如果资源未被修改,返回 304
} else {
res.send('Resource content');
}
});
Cache-Control: max-age=0
Cache-Control: max-age=0
表示即使有缓存,客户端也应该立即重新验证资源的有效性。这通常意味着客户端希望强制刷新资源,即使缓存中有可用副本。在这种情况下,客户端会发送一个带有 If-Modified-Since
的请求,服务器会检查资源是否已被修改,并根据结果返回 200 OK
或 304 Not Modified
。
app.get('/resource', (req, res) => {
const lastModified = new Date(fs.statSync('path/to/resource').mtime).toUTCString();
res.setHeader('Last-Modified', lastModified);
res.setHeader('Cache-Control', 'max-age=1000'); // 设置缓存时间为1000秒
if (req.headers['if-modified-since'] && req.headers['if-modified-since'] === lastModified) {
res.status(304).send(); // 如果资源未被修改,返回 304
} else {
res.send('Resource content');
}
});
在这个例子中,Cache-Control: max-age=1000
设置了资源在客户端缓存中的有效时间为1000秒。如果客户端在1000秒内再次请求资源,并且请求头中包含 Cache-Control: max-age=0
,则服务器会检查资源是否被修改,并根据情况返回 304 Not Modified
或 200 OK
。
当涉及到HTTP缓存机制时,Expires
、Last-Modified
、If-Modified-Since
以及Cache-Control
等头部字段起着关键作用。下面我将分别解释这些字段,并通过示例代码展示如何在Node.js中设置这些头部字段。
Expires
和Cache-Control:max-age
- Expires 指的是资源过期的时间点。
- Cache-Control:max-age 指的是资源可以被缓存的最大秒数。
当客户端(例如浏览器)接收到带有Expires
或Cache-Control:max-age
响应头的资源时,它会将资源存储在本地缓存中,并且在指定时间内不再向服务器发起请求。
Last-Modified
和If-Modified-Since
- Last-Modified 是指资源最后修改的时间。
- If-Modified-Since 是客户端在后续请求时用来告诉服务器资源上次请求时的最后修改时间。
如果资源自该时间以来没有被修改,则服务器返回一个304 Not Modified
状态码,客户端使用缓存中的副本,从而减少带宽消耗。
示例代码
以下是在Node.js中使用Express框架设置Expires
和Cache-Control
响应头的简单示例:
const express = require('express');
const app = express();
app.get('/example', (req, res) => {
const lastModified = new Date().toUTCString();
const expires = new Date(Date.now() + 1000 * 60 * 60).toUTCString(); // 设置1小时后过期
res.set({
'Last-Modified': lastModified,
'Expires': expires,
'Cache-Control': 'max-age=3600' // 同样设置为1小时后过期
});
res.send('Hello, World!');
});
app.listen(3000, () => console.log('Server is running on port 3000'));
Cache-Control:max-age=0
解释
当客户端发送请求时包含Cache-Control:max-age=0
,这意味着客户端明确表示不希望使用缓存中的任何版本,而是希望获取最新的资源。在这种情况下,即使存在有效的缓存,服务器也会处理请求并可能返回一个新的响应,而不是返回304状态码。
通过上述解释和示例代码,您可以更好地理解Node.js中HTTP缓存机制的工作原理。