【问题标题】:How to totally prevent HTTP 304 responses in Connect/Express static middleware?如何完全防止 Connect/Express 静态中间件中的 HTTP 304 响应?
【发布时间】:2013-02-01 07:02:00
【问题描述】:

在开发过程中,非常好阻止 HTTP 304 响应(支持 200 响应),并导致 Connect/Express static middleware 从文件系统读取每个响应,而不是执行任何操作完全缓存。

我尝试过使用maxAge 0 和1 的值,但无济于事:

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

【问题讨论】:

    标签: node.js node.js-connect


    【解决方案1】:

    我在开发过程中这样做会收到 200 条回复:

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

    【讨论】:

    • 在生产环境中使用它会有什么影响?我将它用于开发,但我担心如果我删除它,我的用户会遇到同样的问题。
    • 这非常适合开发。我相信,如果您想要生产中的动态行为,应该通过创建单独的路线来相应地提供文件。现实世界的项目需要 304 来处理真正的静态资源和允许动态加载的方式。
    【解决方案2】:
    app.disable('etag');
    

    在响应中防止“etag”可能会有所帮助

    【讨论】:

    • 我们在哪里添加这个?
    • 不,它不会,因为 Express 仍然会计算 ETag 并比较它,只是不返回它。因此,如果服务器之前确实返回了一个 ETag,那么即使您进行了此更改,发送该标签的用户现在仍然会收到 304。见github.com/expressjs/express/pull/2841
    【解决方案3】:

    它会在每次响应时从文件系统中读取。只是如果请求 ETAG 与响应 ETAG 匹配,它不会发送响应的正文,因为它不必发送。它是具有相同哈希的相同文件。这就是 304 响应的工作原理。

    为什么要阻止 304 响应?

    【讨论】:

    • 这让我很困惑,为什么 Express 会返回 304。谢谢!
    • 因为弱 etags 缓存 JS 文件,这对前端开发人员来说可能是一个痛苦。
    【解决方案4】:

    此解决方案只是一种解决方法。您可以通过disabling caching in Chrome 从浏览器端解决问题。如果您需要在 Chrome 以外的地方工作,例如 iOS 上的 Safari,这对您没有帮助。

    【讨论】:

    • 我不明白为什么这是被接受的答案,因为服务消费者不仅是浏览器,还可以是其他服务或 3rd 方软件
    猜你喜欢
    • 2016-03-29
    • 2013-12-11
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2012-06-08
    • 2013-08-22
    相关资源
    最近更新 更多