No se puede deshacer del encabezado X-Powered-By: Express

168

Estoy ejecutando un servidor en nodejs con express. Parece que no puedo deshacerme del encabezado:

X-Powered-By:Express

Me preguntaba si hay alguna forma de deshacerme de este encabezado o si tengo que vivir con él.

Tyronegcarter
fuente
@alessioalex esta pregunta tiene más puntos de vista (por cualquier razón es más popular), así que hagamos otro duplicado de esto.
Alexei Levenkov

Respuestas:

247

En Express> = 3.0.0rc5:

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

Aquí hay un middleware simple que elimina el encabezado en versiones anteriores de Express:

app.use(function (req, res, next) {
  res.removeHeader("x-powered-by");
  next();
});
Giacomo
fuente
16
Tuve que colocarlo antes app.use(app.router);para que funcione.
Pavel Hlobil
2
Igual que app.set ('x-powered-by', falso);
harrisunderwork
1
No funcionó en 4.15.2. La solución @harrisunderwork usando app.set()hizo el truco.
Daniel W.
54

Solo para aprovechar la respuesta de rjack, también podría (opcionalmente) simplemente cambiar (configurar) el encabezado X-powered-by a algo mucho más genial / personalizado como este:

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

A partir de Express v3.0.0rc5, el soporte para deshabilitar el X-Powered-Byencabezado está integrado:

var express = require('express');

var app = express();
app.disable('x-powered-by');
contraste
fuente
10

Aquí hay un práctico middleware que puede colocar para cambiar 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

La configuración de X-Powered by en este caso anularía el valor predeterminado 'Express', por lo que no es necesario deshabilitar Y establecer un nuevo valor.

papercowboy
fuente
3

Tal vez esto podría ser obvio para los usuarios Express más experimentados, pero solo esto funcionó para mí:

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

A veces las respuestas en la parte superior no funcionan. Este es mi caso Tengo Express 4.17.1 y ninguna respuesta no funciona. Entonces inventé mi propia solución:

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();
});
1 instinto
fuente
Trabajó para Express versión 4.16.3 también. Ninguna otra solución funcionó.
Xyroid
1
trabajó para mí también, gracias!
Fernix
2

Para Ocultar, X-Powered By puedes usar el casco Node .js Library .

El enlace para eso es casco

var helmet = require('helmet');
app.use(helmet.hidePoweredBy());
arjun kori
fuente
¿Incluirías una biblioteca completa para esto?
Moha el todopoderoso camello
sí, tenemos que usar la biblioteca de cascos. Si está usando expressjs fremework, entonces puede evitar la biblioteca con este código app.disable ("x-powered-by");
Arjun kori
2

Ninguna de las soluciones estándar funciona para mí tampoco. Después de mucha búsqueda descubrí que usamos un archivo de rutas donde se inició una nueva instancia express, que luego se agregó a la primera mediante app.use. Solo para las rutas en esta nueva instancia expresa, el encabezado X-Powered-By estaba presente.

Vista simplista del problema:

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

La solución fue simplemente crear un nuevo Express.Router en lugar de una instancia completa.

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

Lectura del código https://github.com/visionmedia/express/blob/master/lib/http.js#L72 me hace pensar que tendrá que vivir con él, ya que no parece ser condicional.

Si tiene un frontend nginx / apache, aún puede eliminar el encabezado (con mod_headers para apache y headers-more para nginx)

hellvinz
fuente
1
Creo que el enfoque del servidor web es el mejor de todos modos. Esto apoya una mejor práctica.
Dominic
0

removeHeader solo funcionará en middleware de ruta, ejemplo de coffeescript

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

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

Nada de esto funcionó para mí, excepto esto (debe agregar otro parámetro):

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

Estoy usando Express ^ 4.17

László Matuska
fuente