40

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

我们已经尝试过app.disable('etag')and res.removeHeader('etag'),但都不起作用;无论如何,该应用程序都会发送标头。

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

4

6 回答 6

63

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

于 2013-11-12T06:56:50.437 回答
28
app.disable('etag')

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

app.use(express.static(path.join(__dirname, 'public'), {
        etag: false
}));
于 2015-04-30T07:22:40.230 回答
3

查看 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}); 
});

这对我来说没问题。

于 2013-11-13T06:44:45.903 回答
2

在我看来,解决您的问题的真正方法是弄清楚为什么它由于 etags 而表现异常。

不过,要回答您的问题,Express 目前不支持禁用 etags 标头。它实际上已在此拉取请求中进行了讨论和合并,但后来被恢复了。如果您真的需要这个并且不想尝试解决根本问题,您可以随时应用该补丁并从那里开始。

于 2013-03-03T22:51:43.523 回答
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

于 2018-08-05T12:52:23.553 回答
1

你不能使用快递

您只能制作它们false,但这仍然会导致 304 重定向,因为您的 etag 将匹配最后一个请求(返回的false

我从另一个 npm 包https://github.com/helmetjs/nocache/issues/9)中使用了这个解决方案,它使用npm 包在express 添加 etagon-headers修改标头。

这可以添加到您res被呼叫的任何地方,用于特定路线或所有路线:

const onHeaders = require('on-headers');

onHeaders(res, function () {
    this.removeHeader('etag');
});

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

于 2018-11-13T20:13:00.013 回答