Не удается избавиться от заголовка X-Powered-By: Express

168

Я работаю на сервере на nodejs с экспресс. Я не могу избавиться от заголовка:

X-Powered-By:Express

Мне было интересно, есть ли способ избавиться от этого заголовка или я должен жить с этим?

tyronegcarter
источник
@alessioalex этот вопрос имеет больше просмотров (по тем или иным причинам он более популярен), поэтому давайте сделаем другой дубликат этого.
Алексей Левенков

Ответы:

247

В Express> = 3.0.0rc5:

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

Вот простое промежуточное ПО, которое удаляет заголовок в более ранних версиях Express:

app.use(function (req, res, next) {
  res.removeHeader("x-powered-by");
  next();
});
Giacomo
источник
16
Я должен был поместить это прежде, app.use(app.router);чтобы это работало.
Павел Хлобил
2
То же, что app.set («x-powered-by», false);
Harrisunderwork
1
Не работал в 4.15.2. @harrisunderwork с помощью решения app.set()сделал свое дело.
Даниэль В.
54

Просто чтобы прокрутить ответ rjack, вы также можете (необязательно) просто изменить (установить) заголовок X-powered-by на что-то более прохладное / пользовательское, например:

app.use(function (req, res, next) {
  res.header("X-powered-by", "Blood, sweat, and tears")
  next()
})
Кристофер Скотт
источник
50

Начиная с Express v3.0.0rc5, поддержка отключения X-Powered-Byзаголовка встроена:

var express = require('express');

var app = express();
app.disable('x-powered-by');
отличительный признак
источник
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 by в этом случае переопределяет значение по умолчанию 'Express', поэтому вам не нужно одновременно отключать И устанавливать новое значение.

papercowboy
источник
3

Возможно, это может быть очевидно для более опытных пользователей Express, но только это сработало для меня:

app.configure(function() {
    app.use(function (req, res, next) {
        res.removeHeader("X-Powered-By");
        next();
    });
});
pongi
источник
3

Иногда ответы вверху не работают. Это мой случай. У меня есть Экспресс 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();
});
1nstinct
источник
Работал для Express версии 4.16.3 также. Ни одно другое решение не сработало.
Xyroid
1
работал для меня тоже спасибо!
Ферникс
2

Для скрытия, X-Powered By вы можете использовать Node .js Library шлем .

Связь Для этого есть шлем

var helmet = require('helmet');
app.use(helmet.hidePoweredBy());
Арджун Кори
источник
Вы бы включили целую библиотеку для этого?
Моха всемогущий верблюд
да, мы должны использовать библиотеку шлемов. Если вы используете fremework для expressjs, вы можете избежать использования библиотеки с помощью этого кода app.disable ("x-powered-by");
Арджун Кори
2

Ни один из стандартных решений для меня тоже не работает. После долгих поисков я обнаружил, что мы использовали файл маршрутов, где был запущен новый экспресс-экземпляр, который позже был добавлен к первому с помощью 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);

Решением было просто создать новый экспресс. Маршрутизатор вместо целого экземпляра.

const moreRoutes = express.Router();
Жако Мол
источник
1

Чтение кода https://github.com/visionmedia/express/blob/master/lib/http.js#L72 заставляет меня думать, что вам придется с этим смириться, поскольку он не выглядит условным.

Если у вас есть интерфейс nginx / apache, вы все равно можете удалить с ним заголовок (с mod_headers для apache и headers-more для nginx)

hellvinz
источник
1
Я думаю, что веб-сервер лучше всего подходит. Это поддерживает лучшую практику.
Доминик
0

removeHeader будет работать только в промежуточном программном обеспечении маршрута, пример coffeescript

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

app.get '/posts', fix_headers, (req, res, next) ->
  ...
Деян Ранисавлевич
источник
0

У меня ничего не получалось, кроме этого (нужно добавить еще один параметр):

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

Я использую Express ^ 4.17

Ласло Матуска
источник