使用 max-age=0,must-revalidate 表示静态服务器缓存控制

Express static server cache control with max-age=0,must-revalidate

我已经使用 express 设置了一个简单的静态服务器。

var location = path.join(__dirname, 'public');
app.use(express.static(location, { cacheControl: true, setHeaders: function(res, path) { 
    res.setHeader("Cache-Control","max-age=0,must-revalidate");  
} }));

请求 header 与 If-None-MatchIf-Modififed-Since 一起发送,如果我重新加载页面,我还可以在 Chrome 的响应中看到 304 Not Modified无需修改文件。如果我修改其中一个文件,我会得到 200 OK

但是,为什么我的 Chrome 网络选项卡显示的是下载文件的大小,而不是在状态代码为 304 Not Modified 时显示 (from memory cache)

我希望文件在未修改的情况下从缓存中加载,并在修改后从服务器提供。

感谢任何帮助和指导。

当浏览器将某些内容放入缓存时,它还会存储来自服务器的 Last-Modified 或 ETag header。然后使用此标记发送带有 If-Modified-Since 或 If-None-Match header 的请求,实际上告诉服务器如果内容仍然具有该 ETag 则发送 304。

在你的情况下 Chrome 正在请求询问服务器是否应该使用它的缓存 有一个旧的 post 解释这个 here

您可能想查看此 website 关于通过 HTTP 缓存提高应用程序性能的内容 Headers。

@sBanda 描述的很好。收到 304 是预期的,因为指定的 cache-control 策略将文件声明为过时的,但 ETag 检查显示它没有更改。您得到 304 是因为您可能没有请求特定资源,但您却请求了,浪费带宽和cpu负载。

你应该做些什么来避免它是这样的:

const express       = require('express');


const server        = express();
const oneHour       = 3600000;    // 3600000msec == 1hour

server.use(express.static('www', { maxAge: oneHour })); // Client-side file caching

server.get('/', function(req, res) {
  res.sendFile(__dirname + '/index.html');
});

server.listen(8080);

Source