无法删除标题 X-Powered-By: Express

我正在使用 Express 运行服务器上的 nodejs。我似乎无法删除标题:

X-Powered-By:Express

我想知道是否有任何方法可以摆脱这个标题,或者我必须忍受它吗?

49992 次浏览

阅读代码 https://github.com/visionmedia/express/blob/master/lib/http.js#L72让我觉得你将不得不忍受它,因为它似乎不是有条件的。

如果你有一个 nginx/apache 前端,你仍然可以用它来删除头部(对于 apache 和头部使用 mod _ headers-对于 nginx 更多)

In Express > = 3.0.0 rc5:

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

下面是一个简单的中间件,它删除了早期版本的 Express 中的头部:

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

RemoveHeader 只能在路由中间件中工作,

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


app.get '/posts', fix_headers, (req, res, next) ->
...

仅仅是搭乘 rjack 的回答,你也可以(可选地)只是改变(设置) X 驱动的头部到一些更酷/自定义像这样:

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

也许对于经验丰富的 Express 用户来说,这一点是显而易见的,但只有这一点对我有效:

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

在 Express v3.0.0 rc5中,内置了对禁用 X-Powered-By报头的支持:

var express = require('express');


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

这里有一个方便的中间件,你可以用它来替换 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 将覆盖默认的“ Express”,因此您不需要同时禁用 AND 设置新值。

从源代码(http://expressjs.com/en/api.html#app.set)。在 Express 4.X 只是设置应用程序使用下面的行;

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

对于隐藏,可以使用 Node.js 库 头盔

链接是 头盔

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

这些方法对我都不管用,除了这个(您需要添加另一个参数) :

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

我使用 Express ^ 4.17

有时候最上面的答案不起作用。这是我的案子。我有特快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();
});

我也没有标准的解决方案。经过多次搜索,我发现我们使用了一个路由文件,其中启动了一个新的 Express 实例,后来通过使用 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();

注意 : 答案分散在帖子中,这是一个汇编,加上我自己的一些补充。他们都经过了考验。

注意2 : 缺少了一些重要的东西: 如果你使用开发服务器(Angular,React 或 webpack dev server)在前端检查头部,你仍然会看到头部。这是因为 webpack-dev-server 实际上是一个 Express 服务器,您看到的是来自该应用程序的头文件。如果使用这些选项之一,您的后端将不会发送标题。


有很多方法可以做到这一点。

  1. 默认情况下使用 Express 选项禁用 "X-powered-by"
import express from 'express'
const app = express()
app.disable('x-powered-by')
// app.use(...)


2)使用中间件在每次请求时删除它:

  • 移除 X-powered-by
import express from 'express'
const app = express()


app.use(function (req, res, next) {
res.removeHeader("X-Powered-By");
next();
});
  • X-powered-by值更改为其他值
import express from 'express'
const app = express()


app.use(function (req, res, next) {
res.header("X-powered-by", "not-Express")
next()
})


3)使用 头盔删除它,并配置10个其他 HTTP 推荐头(“ 虽然不是万能的,但还是有用的!”)

  • 默认设置(应用所有11个 HTTP 头)
import express from 'express'
import helmet from 'helmet'
const app = express()


app.use(helmet())
  • 移除 X-powered-by
import express from 'express'
import helmet from 'helmet'
const app = express()


app.use(helmet.hidePoweredBy());

与「注2」有关的资料:

如果您使用 webpack-dev-server 进行热重载,您仍然会看到这个头部。这是因为它使用了一个 Express 服务器,所以头部来自它,而不是来自您正在配置的后端 Express。

即使没有设置 webpack-dev-server,一些在主要前端框架中使用的样板工具(如 crate-response-app)仍然会在底层使用 webpack-dev-server。

例如,如果在 CRA 中检查 start脚本(在执行“ npm start”时被调用) :

showing npm start react script