etag
标头。我们在Express中编写了一个Web服务API,在向客户端发送ETags并且客户端发送if-none-match
标头时,客户端看到意外结果。我们尝试过
app.disable('etag')
和res.removeHeader('etag')
,但两者都不起作用。应用程序仍会发送标头。是否有其他方法可以禁用所有响应中的此标头?
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
app.disable('etag')
这将禁用所有请求的etag头,但不包括静态内容。以下代码可针对静态内容实现此操作:app.use(express.static(path.join(__dirname, 'public'), {
etag: false
}));
res.sendFile('...', { etag: false })
也是有效的。在我的情况下,app.disable('etag')
和 app.set('etag', false)
都不起作用。 - youen这个示例完美运行。
Can add/remove any header :)
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')
})
}
查看Express的response.js文件,只有在请求方法为GET时才会发送Etags标记。您可以在调用response.send()之前将请求方法设置为其他内容,以防止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});
});
对我来说,这个运作良好。
在我看来,解决您的问题的真正方法是找出为什么由于ETag而表现奇怪。
不过,回答您的问题,Express目前没有禁用ETag标头的支持。实际上,在此拉取请求中已经讨论并合并了它,但后来被撤销了。如果您确实需要此功能并且不想尝试修复根本问题,您可以应用该补丁,并从那里开始。
无法使用express
您只能将它们设置为false
,但这仍会导致304重定向,因为您的ETag将与上次请求匹配(返回false
)
我使用了来自另一个npm包的此解决方案(https://github.com/helmetjs/nocache/issues/9),该解决方案使用on-headers
npm包在express添加ETag之后修改标题。
这可以添加到您调用res
的任何位置,适用于特定路由或所有路由:
const onHeaders = require('on-headers');
onHeaders(res, function () {
this.removeHeader('etag');
});
注意,您可能还需要更改缓存设置。但这会删除您的快速ETags :)