使用max-age = 0表示静态服务器缓存控制,必须重新验证

时间:2017-06-17 18:30:27

标签: node.js express http-caching

我使用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");  
} }));

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

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

如果文件没有被修改并且如果被修改则从服务器提供,我期待文件从缓存加载。

感谢任何帮助和指导。

2 个答案:

答案 0 :(得分:8)

@sBanda很好地描述了这种情况。由于指定的cache-control策略将文件声明为陈旧,但预期接收304,但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

答案 1 :(得分:4)

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

在您的情况下,Chrome正在请求服务器使用其缓存 有一篇旧帖子解释了这个here

您可能希望查看此website,了解如何通过HTTP缓存标头提高应用程序性能。