禁用Express Node.js中的etag标头

时间:2013-03-03 22:10:07

标签: node.js express

我们需要从Node.js Express应用程序中的所有HTTP响应中删除etag标头。我们有一个用Express编写的Web服务API,当我们发送etags并且客户端发送回if-none-match标题时,客户端会看到意外的结果。

我们尝试了app.disable('etag')res.removeHeader('etag'),但都没有工作;应用程序无论如何发送标头。

在所有回复中是否还有其他方法可以禁用此标头?

6 个答案:

答案 0 :(得分:47)

app.disable('etag')现在应该可以使用,已经有一个拉取请求合并来处理这个问题:

https://github.com/visionmedia/express/commit/610e172fcf9306bd5812bb2bae8904c23e0e8043

更新:正如Bigood在评论中指出的那样,新的做事方式如下

app.set('etag', false); // turn off

版本3.9.0发生了变化:https://github.com/strongloop/express/releases/tag/3.9.0

有关设置etag的更多选项,请在此处查看4.x文档:http://expressjs.com/4x/api.html#app.set

答案 1 :(得分:22)

app.disable('etag')

这将禁用所有请求的etag标头,但不会禁用静态内容。以下是静态内容:

app.use(express.static(path.join(__dirname, 'public'), {
        etag: false
}));

答案 2 :(得分:2)

在我看来,你的问题的真正解决方案是弄清楚为什么它由于etags而表现得很奇怪。

要回答您的问题,Express目前不支持禁用etags标头。它实际上已经讨论并合并in this pull request,但后来又被还原了。如果你确实需要这个并且不想尝试解决根问题,你可以随时应用该补丁并从那里开始。

答案 3 :(得分:2)

查看express response.js,Etags仅在请求方法为GET时发送。 您可以通过在调用response.send()之前将request.method设置为其他内容来阻止express在响应中发送etags。

例如:

app.get('/path/returnsJSON', function(req, res){
/* HACK to workaround the framework sending e-tags and "304 NOT MODIFIED" responses */
req.method="NONE"; // was "GET"
res.status(200).send({data:1}); 
});

这对我有用。

答案 4 :(得分:2)

此示例效果很好。

  1. 没有未记录的黑客行为
  2. 每个端点的微调
  3. 可以添加/删除任何标题:)

    var onHeaders = require('on-headers')
    
    function myRoute(req, res) {
      scrubETag(res)
      // do the rest
      res.send('something')
    }
    
    function scrubETag(res) {
      onHeaders(res, function () {
        this.removeHeader('ETag')
      })
    }
    

来源:https://github.com/expressjs/express/issues/2472

答案 5 :(得分:0)

您不能使用快递

您只能将它们设置为ConfigObj,但这仍将导致304重定向,因为您的etag将匹配上一个请求(返回了false

我从另一个npm软件包中使用了此解决方案https://github.com/helmetjs/nocache/issues/9),该软件包使用false npm软件包来修改标头 后, 。

这可以添加到您调用on-headers的任何位置,用于特定路由或所有路由:

res

注意,您可能还需要更改缓存设置。但这会删除您的明确etags :)