Nodejs中关于304 Expires的时间,Cache-Control:max-age=0的解释

Nodejs中关于304 Expires的时间,Cache-Control:max-age=0的解释

304 的 Expires 的时间有什么用? Last-ModifiedIf-Modified-Since 去判断是不是 304? 浏览器请求头:Cache-Control:max-age=0 ? response 头:Cache-Control:max-age=1000 控制缓存时间?

3 回复

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-ModifiedIf-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 OK304 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 Modified200 OK


浏览器请求头:Cache-Control:max-age<=0表示每次请求都会访问服务器并通过Last-Modified确定文件是否已修改,若已修改,返回最新文件,否则返回304读取缓存文件。Cache-Control:max-age>0表示直接读取缓存。Cache-Control:no cache表示总是请求服务器最新文件,无304。 Expires 的时间有什么用?expires用于当浏览器请求总是使用缓存的时候Cache-Control:max-age>0,根据该时间来判断什么时候该去请求服务器了。 response 头:Cache-Control:max-age=1000 控制缓存时间?表示Cache-Control的优先级高于Expires,但有的浏览器不支持Cache-Control,这时采用Expires 不知道回答的对不对,刚好看到了,就回答一下。^_^不过你肯定已经解决了~

当涉及到HTTP缓存机制时,ExpiresLast-ModifiedIf-Modified-Since以及Cache-Control等头部字段起着关键作用。下面我将分别解释这些字段,并通过示例代码展示如何在Node.js中设置这些头部字段。

ExpiresCache-Control:max-age

  • Expires 指的是资源过期的时间点。
  • Cache-Control:max-age 指的是资源可以被缓存的最大秒数。

当客户端(例如浏览器)接收到带有ExpiresCache-Control:max-age响应头的资源时,它会将资源存储在本地缓存中,并且在指定时间内不再向服务器发起请求。

Last-ModifiedIf-Modified-Since

  • Last-Modified 是指资源最后修改的时间。
  • If-Modified-Since 是客户端在后续请求时用来告诉服务器资源上次请求时的最后修改时间。

如果资源自该时间以来没有被修改,则服务器返回一个304 Not Modified状态码,客户端使用缓存中的副本,从而减少带宽消耗。

示例代码

以下是在Node.js中使用Express框架设置ExpiresCache-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缓存机制的工作原理。

回到顶部