Não é possível se livrar do cabeçalho X-Powered-By: Express

168

Estou executando um servidor no nodejs com express. Não consigo me livrar do cabeçalho:

X-Powered-By:Express

Eu queria saber se existe alguma maneira de se livrar desse cabeçalho ou eu tenho que viver com ele?

tyronegcarter
fonte
@alessioalex esta pergunta tem mais visualizações (por qualquer motivo que seja mais popular), então vamos fazer outra duplicata disso.
Alexei Levenkov 04/10/2014

Respostas:

247

No Express> = 3.0.0rc5:

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

Aqui está um middleware simples que remove o cabeçalho nas versões anteriores do Express:

app.use(function (req, res, next) {
  res.removeHeader("x-powered-by");
  next();
});
Giacomo
fonte
16
Eu tive que colocá-lo antes app.use(app.router);para que ele funcionasse.
Pavel Hlobil 14/01
2
O mesmo que app.set ('x-powered-by', false);
harrisunderwork
1
Não funcionou 4.15.2. solução @harrisunderwork usando app.set()fez o truque.
Daniel W.
54

Apenas para acompanhar a resposta de rjack, você também pode (opcionalmente) alterar (definir) o cabeçalho alimentado por X para algo muito mais legal / personalizado como este:

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

A partir do Express v3.0.0rc5, o suporte para desativar o X-Powered-Bycabeçalho é incorporado:

var express = require('express');

var app = express();
app.disable('x-powered-by');
marca
fonte
20

Na fonte ( http://expressjs.com/en/api.html#app.set ). No Express 4.X, basta definir o aplicativo usando a linha abaixo;

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

Aqui está um middleware útil que você pode usar para trocar o 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

A configuração de X-Powered nesse caso substituirá o padrão 'Express', para que você não precise desativar E definir um novo valor.

papercowboy
fonte
3

Talvez isso possa ser óbvio para os usuários mais experientes do Express, mas apenas isso funcionou para mim:

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

Às vezes, as respostas no topo não funcionam. Este é o meu caso. Eu tenho o Express 4.17.1 e ninguém responde não funciona. Então, eu inventei minha própria solução:

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();
});
1nstinct
fonte
Também funcionou para a versão 4.16.3 do Express. Nenhuma outra solução funcionou.
Xyroid
1
trabalhou para mim também obrigado!
Fernix
2

Para ocultar, X-Powered By, você pode usar o capacete da biblioteca Node .js .

O Link Para isso é capacete

var helmet = require('helmet');
app.use(helmet.hidePoweredBy());
arjun kori
fonte
Você incluiria uma biblioteca inteira para isso?
Moha o todo-poderoso camelo
sim, temos que usar a biblioteca de capacete. Se você estiver usando o expressjs fremework, poderá evitar a biblioteca usando este código app.disable ("x-powered-by");
arjun kori 21/06
2

Nenhuma das soluções padrão trabalha para mim também. Depois de muita pesquisa, descobri que usamos um arquivo de rotas em que uma nova instância expressa foi iniciada, que foi posteriormente adicionada à primeira usando app.use. Somente para as rotas nessa nova instância expressa, o cabeçalho X-Powered-By estava presente.

Visão simplista da questão:

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);

A solução foi simplesmente criar um novo express.Router em vez de uma instância inteira.

const moreRoutes = express.Router();
Jacco Mol
fonte
1

Lendo o código https://github.com/visionmedia/express/blob/master/lib/http.js#L72 me faz pensar que você terá que conviver com ele, pois não parece ser condicional.

Se você possui um frontend nginx / apache, ainda pode remover o cabeçalho com ele (com mod_headers para apache e headers-more para nginx)

hellvinz
fonte
1
Eu acho que a abordagem do servidor web é a melhor de qualquer maneira. Isso suporta uma prática recomendada.
Dominic
0

removeHeader funcionará apenas no middleware de rota, exemplo de coffeescript

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

app.get '/posts', fix_headers, (req, res, next) ->
  ...
Dejan Ranisavljevic
fonte
0

Nada disso funcionou para mim, exceto isso (você precisa adicionar outro parâmetro):

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

Estou usando o Express ^ 4.17

László Matuska
fonte