我们需要从Node.js Express应用程序中的所有HTTP响应中删除etag
标头。我们有一个用Express编写的Web服务API,当我们发送etags并且客户端发送回if-none-match
标题时,客户端会看到意外的结果。
我们尝试了app.disable('etag')
和res.removeHeader('etag')
,但都没有工作;应用程序无论如何发送标头。
在所有回复中是否还有其他方法可以禁用此标头?
答案 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)
此示例效果很好。
可以添加/删除任何标题:)
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')
})
}
答案 5 :(得分:0)
您不能使用快递
您只能将它们设置为ConfigObj
,但这仍将导致304重定向,因为您的etag将匹配上一个请求(返回了false
)
我从另一个npm软件包中使用了此解决方案(https://github.com/helmetjs/nocache/issues/9),该软件包使用false
npm软件包来修改标头 后, 。
这可以添加到您调用on-headers
的任何位置,用于特定路由或所有路由:
res
注意,您可能还需要更改缓存设置。但这会删除您的明确etags :)