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

ani*_*vas 3 http-caching node.js express

我使用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");  
} }));
Run Code Online (Sandbox Code Playgroud)

请求头与发送If-None-Match,并If-Modififed-Since和我还可以看到304 Not Modified在Chrome中回应,如果我重新加载页面,而无需修改文件.200 OK如果我修改其中一个文件,我会得到一个.

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

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

感谢任何帮助和指导.

man*_*nak 12

@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);
Run Code Online (Sandbox Code Playgroud)

资源

  • 啊哈,现在我们到了某个地方;) 向 [`Cache Invalidation`](https://halfelf.org/wp-content/uploads/sites/2/2016/10/jeff-atwood.png) 问题问好,一个古老的,可能是计算机科学本身。好吧,Web 开发人员通常做的是将 maxAge 设置为一个巨大的值(1 年),当文件更改时,他们将其重命名为 `main.css` -> `main_v2.css`。因为这变得越来越难,我们通常会使用 gulp 等构建工具自动将文件“main_4abed1c996f46e1b2ad61757af46ece4.css”的哈希值附加到文件名中,这样任何更改都会自动使缓存失效。 (3认同)

sBa*_*nda 5

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

在您的情况下,Chrome正在请求服务器是否应使用其缓存,这里有一篇旧文章对此进行解释。

您可能想查看有关通过HTTP缓存头提高应用程序性能的网站