无法摆脱标题X-Powered-By:Express

时间:2011-05-03 08:53:38

标签: javascript node.js express http-headers webserver

我正在使用express运行nodejs上的服务器。我似乎无法摆脱标题:

X-Powered-By:Express

我想知道是否有办法摆脱这个标题,还是我不得不忍受它?

12 个答案:

答案 0 :(得分:243)

在Express> = 3.0.0rc5:

app.disable('x-powered-by');

这是一个简单的中间件,它删除了早期版本的Express中的标题:

app.use(function (req, res, next) {
  res.removeHeader("x-powered-by");
  next();
});

答案 1 :(得分:51)

只是为了捎带rjack的答案,你也可以(可选)将X-powered-by标题更改(设置)为更冷/定制的东西:

app.use(function (req, res, next) {
  res.header("X-powered-by", "Blood, sweat, and tears")
  next()
})

答案 2 :(得分:17)

从源头(http://expressjs.com/en/api.html#app.set)。在Express 4.X中,只需使用下面的行设置应用程序;

app.set('x-powered-by', false) // hide x-powered-by header!

答案 3 :(得分:10)

这是一个方便的中间件,您可以插入以换出X-Powered-By:

function customHeaders( req, res, next ){
  // Switch off the default 'X-Powered-By: Express' header
  app.disable( 'x-powered-by' );

  // OR set your own header here
  res.setHeader( 'X-Powered-By', 'Awesome App v0.0.1' );

  // .. other headers here

  next()
}

app.use( customHeaders );

// ... now your code goes here

在这种情况下设置X-Powered将覆盖默认的“Express”,因此您无需同时禁用AND设置新值。

答案 4 :(得分:3)

对于经验丰富的Express用户来说,这可能是显而易见的,但只有这对我有用:

app.configure(function() {
    app.use(function (req, res, next) {
        res.removeHeader("X-Powered-By");
        next();
    });
});

答案 5 :(得分:3)

有时顶部的答案不起作用。这是我的情况。我拥有Express 4.17.1,没有人无法解决。因此,我发明了自己的解决方案:

let app = express();

app.use((req, res, next) => {
  const send = res.send;
  res.send = (data) => {
    res.removeHeader('X-Powered-By');
    return send.call(res, data);
  };

  next();
});

答案 6 :(得分:2)

我都不是标准解决方案工作者。经过大量搜索,我发现我们使用了一个路由文件,在该文件中启动了一个新的Express实例,该实例随后通过使用app.use添加到了第一个实例中。仅针对此新快递实例中的路由,存在X-Powered-By标头。

简单的问题视图:

const app = express();
app.disable("x-powered-by");
app.get("/ping", (req, res) => res.send("Pong")); // <-- no X-Powered-By header

const moreRoutes = express();
moreRoutes.get("/ping", (req, res) => res.send("Pong")); // <-- X-Powered-By header still present

app.use("/api/v2", moreRoutes);

解决方案只是创建一个新的express.Router,而不是整个实例。

const moreRoutes = express.Router();

答案 7 :(得分:1)

阅读代码https://github.com/visionmedia/express/blob/master/lib/http.js#L72让我觉得你必须忍受它,因为它似乎没有条件。

如果你有一个nginx / apache前端,你仍然可以用它删除标题(使用mod_headers for apache和headers-more for nginx)

答案 8 :(得分:1)

对于隐藏,X-Powered By您可以使用Node .js Library 头盔

链接就是helmet

var helmet = require('helmet');
app.use(helmet.hidePoweredBy());

答案 9 :(得分:0)

removeHeader仅适用于路由中间件,coffeescript示例

fix_headers =  (req, res, next) ->
    res.removeHeader 'X-Powered-By'
    next()

app.get '/posts', fix_headers, (req, res, next) ->
  ...

答案 10 :(得分:0)

除了这个(您需要添加另一个参数)之外,这些都不对我有用:

app.use(helmet.hidePoweredBy({ setTo: 'guesswhat' }))

我正在使用Express ^ 4.17

答案 11 :(得分:0)

注意:答案分散在各个帖子中,这是一个汇编,加上我自己的一些补充。他们都经过测试。

注释2 :缺少一些重要的东西:如果您正在使用Angular,React或webpack开发服务器等开发服务器检查前端中的标头,则仍然会看到标头。这是因为webpack-dev-server确实是Express服务器,并且您看到的是该应用程序提供的标头。如果使用以下选项之一,则后端将不会发送标头。


有很多方法可以做到这一点。

  1. 默认情况下,禁用带有Express选项的"X-powered-by"
import express from 'express'
const app = express()
app.disable('x-powered-by')
// app.use(...)


2)使用中间件在每个请求上将其删除:

  • 移除X-powered-by
import express from 'express'
const app = express()

app.use(function (req, res, next) {
  res.removeHeader("X-Powered-By");
  next();
});
  • X-powered-by的值更改为其他值
import express from 'express'
const app = express()

app.use(function (req, res, next) {
  res.header("X-powered-by", "not-Express")
  next()
})


3)使用helmet将其删除,并配置10个其他HTTP推荐的标头(“ 这不是灵丹妙药,但可以提供帮助!”)

  • 默认设置(应用所有11个HTTP标头)
import express from 'express'
import helmet from 'helmet'
const app = express()

app.use(helmet())
  • 只需删除X-powered-by
import express from 'express'
import helmet from 'helmet'
const app = express()

app.use(helmet.hidePoweredBy());

与“注释2”有关:

如果您正在使用webpack-dev-server进行热重装,则仍会看到此标头。那是因为它使用的是Express服务器,因此标头来自于它,而不是来自您正在配置的后端Express。

即使没有设置webpack-dev-server,主要前端框架中使用的一些样板工具(如crate-react-app)仍将在后台使用webpack-dev-server。

例如,如果您检查CRA中的start脚本(在执行“ npm start”时被调用):

showing npm start react script