如何完全防止 Connect/Express 静态中间件返回 HTTP 304 响应?

17

在开发过程中,有时候最好是防止 HTTP 304 响应(而选择 200),并且让 Connect/Express 静态中间件 每次都要从文件系统读取每个响应,而不使用任何缓存。

我尝试过使用 maxAge 值为 0 和 1,但没有任何效果:

app.use(express.static(__dirname + '/public', { maxAge: 1 }))
4个回答

20

我在开发过程中这样做,可以得到200个响应:

var express = require('express');
app = express();
app.use(function(req, res, next) {
  req.headers['if-none-match'] = 'no-match-for-this';
  next();    
});

在生产环境中使用它会有什么后果?我正在开发中使用它,但我担心如果我删除它,我的用户将遇到同样的问题。 - Hawkee
这非常适合开发。我认为,如果您想要在生产环境中获得动态行为,应该通过创建单独的路由来相应地提供文件。实际项目需要同时具备针对静态资源的304处理和允许动态加载的方式。 - Andrei

9
app.disable('etag');

防止响应中的 'etag' 可能会有所帮助。

1
我们把这个添加到哪里? - SharpCoder
2
不会,因为Express仍然会计算ETag并进行比较,只是不返回它。因此,如果服务器之前返回了ETag,则发送该标记的用户现在仍将获得304,即使您进行了此更改。请参见https://github.com/expressjs/express/pull/2841/。 - CherryDT

5

每次响应时它都会从文件系统读取内容。只要请求的ETAG与响应的ETAG匹配,它就不会发送响应体,因为没有必要。这是相同哈希值的相同文件。这就是304响应的工作原理。

你为什么要防止304响应?


5
我很困惑为什么 Express 会返回 304 状态码,希望能得到解答。谢谢! - Tyler Johnson
3
由于弱ETag缓存JS文件可能会让前端开发人员感到困扰,因此需要进行优化。 - Ivan Kleshnin

0

这个解决方案只是一个权宜之计。你可以通过在Chrome中禁用缓存来从浏览器端解决问题。但如果你需要在Chrome以外的地方工作,比如iOS上的Safari,这并不能帮到你。


1
我不明白为什么这是被接受的答案,因为服务消费者不仅仅是浏览器,还可以是其他服务或第三方软件。 - Mladen Oršolić

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接