2013-03-03 230 views
21

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

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

是否有任何其他方法在所有响应中禁用此标头?

回答

34

app.disable('etag')现在应该工作,出现了拉入请求合并处理这个:

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

UPDATE:如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

+0

很酷。标记为正确的答案! – Raj 2013-11-12 16:48:51

+8

有没有办法只为特定的端点禁用etags?我不想在我的api端点上使用etags,但我需要静态内容上的etags。 – Zambonilli 2014-11-04 17:47:37

+0

自3.9.0以来不工作:https://github.com/strongloop/express/releases/tag/3.9.0 – Bigood 2015-10-06 13:13:24

2

在我看来,真正解决您的问题的方法是找出由于etags而导致行为异常的原因。

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

+1

是!慢表示你删除了etags。 – chovy 2013-03-04 00:11:13

+0

我也看到了pull请求,但希望获得框架支持的标准方法,而不是未来不会得到支持的修改。 – Raj 2013-03-04 00:48:33

+1

看起来他们最终把它拉回来:https://github.com/visionmedia/express/pull/1694 – 2013-10-09 17:16:41

2

查看express.js,仅在请求方法为GET时发送Etags。 在调用response.send()之前,您可以通过将request.method设置为其他内容来防止表达式在响应中发送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}); 
}); 

这对我的工作确定。

19
app.disable('etag') 

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

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

这很重要,因为它很容易被人遗忘 – migg 2015-06-25 06:59:04

+0

这没有记录,但它也适用于'res.sendFile('...',{etag:false})''。就我而言,'app.disable('etag')'和'app.set('etag',false)'不起作用。 – youen 2017-06-05 19:24:15