我们需要etag
从我们的 Node.js Express 应用程序中的所有 HTTP 响应中删除标头。我们有一个用 Express 编写的 Web 服务 API,当我们发送 etag 并且客户端发回标头时,会在客户端看到意外结果if-none-match
。
我们已经尝试过app.disable('etag')
and 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
}));
查看 express response.js,仅当请求方法为 GET 时才会发送 Etag。您可以通过在调用 response.send() 之前将 request.method 设置为其他内容来阻止 express 在响应中发送 etag。
例如:
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});
});
这对我来说没问题。
在我看来,解决您的问题的真正方法是弄清楚为什么它由于 etags 而表现异常。
不过,要回答您的问题,Express 目前不支持禁用 etags 标头。它实际上已在此拉取请求中进行了讨论和合并,但后来被恢复了。如果您真的需要这个并且不想尝试解决根本问题,您可以随时应用该补丁并从那里开始。
该示例完美运行。
可以添加/删除任何标题:)
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')
})
}
你不能使用快递
您只能制作它们false
,但这仍然会导致 304 重定向,因为您的 etag 将匹配最后一个请求(返回的false
)
我从另一个 npm 包(https://github.com/helmetjs/nocache/issues/9)中使用了这个解决方案,它使用npm 包在express 添加 etag后on-headers
修改标头。
这可以添加到您res
被呼叫的任何地方,用于特定路线或所有路线:
const onHeaders = require('on-headers');
onHeaders(res, function () {
this.removeHeader('etag');
});
请注意,您可能还需要更改缓存设置。但这会删除您的快递 etags :)