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


168

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

X-Powered-By:Express

Мені було цікаво, чи є спосіб позбутися цього заголовка чи мені з цим потрібно жити?


@alessioalex це питання має більше поглядів (з будь-яких причин воно більш популярне), тому давайте зробимо замість цього інший дублікат.
Олексій Левенков

Відповіді:


247

В експресі> = 3.0.0rc5:

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

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

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

16
Я повинен був розмістити його раніше, app.use(app.router);щоб він працював.
Павло Глобіль

2
Те саме, що app.set ('x-powered-by', false);
harrisunderwork

1
Не працював у 4.15.2. @harrisunderwork рішення, використовуючи зроблений app.set()трюк.
Даніель В.

54

Тільки для того, щоб відповісти на відповідь rjack, ви також можете (необов'язково) просто змінити (встановити) заголовок X-powered на щось набагато крутіше / звичайніше, як це:

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

50

На Експрес 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 за допомогою "Експрес", за замовчуванням буде замінено, тому вам не потрібно обидва вимикання ТА встановлювати нове значення.


3

Можливо, це може бути очевидним для більш досвідчених користувачів Express, але тільки це працювало для мене:

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

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

Працював і для експрес-версії 4.16.3. Жодне інше рішення не працювало.
Xyroid

працював і для мене спасибі!
Фернікс

2

Для приховування X-Powered By можна використовувати шолом Node .js Library .

Посилання для цього - шолом

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

Ви б включили для цього цілу бібліотеку?
Моха всемогутній верблюд

так, ми повинні використовувати бібліотеку шоломів. Якщо ви використовуєте Expressjs fremework, то ви можете уникнути бібліотеки за допомогою цього коду 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);

Рішенням було просто створити новий express.Router замість цілого екземпляра.

const moreRoutes = express.Router();

1

Читання коду https://github.com/visionmedia/express/blob/master/lib/http.js#L72 змушує мене думати, що вам доведеться жити з ним, оскільки це, здається, не є умовним.

Якщо у вас frontend nginx / apache, ви все одно можете видалити заголовок з ним (з mod_headers для apache та заголовками - більше для nginx)


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.