Nie można pozbyć się nagłówka X-Powered-By: Express

168

Uruchamiam serwer na nodejs z express. Nie mogę pozbyć się nagłówka:

X-Powered-By:Express

Zastanawiałem się, czy jest sposób, aby pozbyć się tego nagłówka, czy muszę z tym żyć?

tyronegcarter
źródło
@alessioalex to pytanie ma więcej wyświetleń (z dowolnego powodu jest bardziej popularne), więc zamiast tego zróbmy inny duplikat tego pytania.
Alexei Levenkov

Odpowiedzi:

247

W Express> = 3.0.0rc5:

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

Oto proste oprogramowanie pośredniczące, które usuwa nagłówek we wcześniejszych wersjach Express:

app.use(function (req, res, next) {
  res.removeHeader("x-powered-by");
  next();
});
Giacomo
źródło
16
Musiałem go wcześniej umieścić app.use(app.router);, aby działał.
Pavel Hlobil
2
To samo co app.set ('x-powered-by', false);
harrisunderwork
1
Nie działał w 4.15.2. Rozwiązanie @harrisunderwork za pomocą rozwiązania załatwiło sprawę app.set().
Daniel W.
54

Aby skorzystać z odpowiedzi rjacka, możesz również (opcjonalnie) po prostu zmienić (ustawić) nagłówek X-powered-by na coś znacznie fajniejszego / niestandardowego, takiego jak ten:

app.use(function (req, res, next) {
  res.header("X-powered-by", "Blood, sweat, and tears")
  next()
})
Christophera Scotta
źródło
50

Od wersji Express v3.0.0rc5 obsługa wyłączania X-Powered-Bynagłówka jest wbudowana:

var express = require('express');

var app = express();
app.disable('x-powered-by');
piętno
źródło
20

Ze źródła ( http://expressjs.com/en/api.html#app.set ). W Express 4.X wystarczy ustawić aplikację za pomocą poniższego wiersza;

app.set('x-powered-by', false) // hide x-powered-by header!
efkan
źródło
10

Oto przydatne oprogramowanie pośredniczące, do którego możesz wpaść, aby wymienić 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

Ustawienie X-Powered by w tym przypadku spowodowałoby przesłonięcie domyślnego „Express”, więc nie trzeba jednocześnie wyłączać ORAZ ustawiać nowej wartości.

papercowboy
źródło
3

Może może to być oczywiste dla bardziej doświadczonych użytkowników Express, ale tylko to zadziałało:

app.configure(function() {
    app.use(function (req, res, next) {
        res.removeHeader("X-Powered-By");
        next();
    });
});
pongi
źródło
3

Czasami odpowiedzi u góry nie działają. To jest moja sprawa. Mam Express 4.17.1 i żadna odpowiedź nie działa. Więc wymyśliłem własne rozwiązanie:

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
źródło
Działa również dla Express w wersji 4.16.3. Żadne inne rozwiązanie nie zadziałało.
Xyroid
dla mnie też pracował, dzięki!
Fernix
2

Aby ukryć, X-Powered By możesz użyć hełmu Node .js Library .

Link do tego jest hełmem

var helmet = require('helmet');
app.use(helmet.hidePoweredBy());
arjun kori
źródło
Czy dołączyłbyś do tego całą bibliotekę?
Moha wszechmocny wielbłąd
tak, musimy korzystać z biblioteki hełmów. Jeśli używasz expressjs fremework, możesz uniknąć biblioteki za pomocą tego kodu app.disable ("x-powered-by");
arjun kori
2

Żadne ze standardowych rozwiązań również mi nie odpowiada. Po długich poszukiwaniach dowiedziałem się, że użyliśmy pliku routingu, w którym uruchomiono nową instancję ekspresową, która została później dodana do pierwszej za pomocą app.use. Tylko dla tras w tym nowym wystąpieniu ekspresowym obecny był nagłówek X-Powered-By.

Uproszczone spojrzenie na problem:

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

Rozwiązaniem było po prostu utworzenie nowego express.Router zamiast całej instancji.

const moreRoutes = express.Router();
Jacco Mol
źródło
1

Czytanie kodu https://github.com/visionmedia/express/blob/master/lib/http.js#L72 sprawia, że ​​myślę, że będziesz musiał z nim żyć, ponieważ nie wydaje się to być warunkowe.

Jeśli masz nakładkę nginx / apache, nadal możesz usunąć nagłówek za jej pomocą (z mod_headers dla apache i headers-more dla nginx)

hellvinz
źródło
1
Myślę, że podejście do serwera WWW jest i tak najlepsze. Jest to zgodne z najlepszymi praktykami.
Dominic
0

removeHeader będzie działać tylko w oprogramowaniu pośredniczącym tras, przykład skryptu Coffeescript

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

app.get '/posts', fix_headers, (req, res, next) ->
  ...
Dejan Ranisavljevic
źródło
0

Nic z tego nie działało dla mnie, z wyjątkiem tego (musisz dodać kolejny parametr):

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

Używam Express ^ 4.17

László Matuska
źródło