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

问题描述 投票:0回答:2

我使用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-Match
If-Modififed-Since
发送,如果我在不修改文件的情况下重新加载页面,我还可以在 Chrome 的响应中看到
304 Not Modified
。如果我修改其中一个文件,我会得到一个
200 OK

但是当状态代码为

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

我希望如果文件未修改,则从缓存加载文件,如果修改,则从服务器提供服务。

感谢任何帮助和指导。

node.js express http-caching
2个回答
21
投票

@sBanda 很好地描述了情况。预计会收到 304,因为指定的

cache-control
策略将文件声明为过时的,但 ETag 检查显示它尚未更改。

因此您得到 304,因为您可能没有请求特定资源,但您却这样做了,浪费了带宽和 CPU 负载。

为了避免这种情况,你应该做的是这样的:

const express = require('express')


const server = express()
const oneHour = 3_600_000 // 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)

来源


5
投票

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

在您的情况下,Chrome 正在发出请求,询问服务器是否应该使用其缓存 有一篇旧文章解释了这一点here

您可能想查看这个网站,了解如何通过 HTTP 缓存标头提高应用程序性能。

© www.soinside.com 2019 - 2024. All rights reserved.