【问题标题】:Can't get rid of header X-Powered-By:Express无法摆脱标题 X-Powered-By:Express
【发布时间】:2011-08-17 13:18:43
【问题描述】:

我正在使用 express 在 nodejs 上运行服务器。我似乎无法摆脱标题:

X-Powered-By:Express

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

【问题讨论】:

  • @alessioalex 这个问题有更多的观点(无论出于何种原因它更受欢迎),所以让我们再做一个重复。

标签: javascript node.js express http-headers webserver


【解决方案1】:

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

如果你有一个 nginx/apache 前端,你仍然可以用它来删除标头(对于 apache 使用 mod_headers,对于 nginx 使用 headers-more)

【讨论】:

  • 我认为 Web 服务器方法是最好的。这支持最佳实践。
【解决方案2】:

在 Express >= 3.0.0rc5:

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

这是一个简单的中间件,它在早期版本的 Express 中删除了标头:

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

【讨论】:

  • 我必须把它放在app.use(app.router); 之前才能工作。
  • 同app.set('x-powered-by', false);
  • 4.15.2 中不起作用。使用app.set() 的@harrisunderwork 解决方案成功了。
【解决方案3】:

removeHeader 仅适用于路由中间件、coffeescript 示例

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

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

【讨论】:

    【解决方案4】:

    只是为了搭载 rjack 的回答,您还可以(可选地)将 X-powered-by 标头更改(设置)为更酷/自定义的东西,如下所示:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        从 Express v3.0.0rc5 开始,内置支持禁用 X-Powered-By 标头:

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

        【讨论】:

          【解决方案7】:

          这是一个方便的中间件,您可以将其替换为 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”,因此您不需要同时禁用和设置新值。

          【讨论】:

            【解决方案8】:

            来自源 (http://expressjs.com/en/api.html#app.set)。在 Express 4.X 中,只需使用以下行设置应用程序;

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

            【讨论】:

              【解决方案9】:

              对于隐藏,X-Powered By 你可以使用 Node .js 库 helmet

              链接是helmet

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

              【讨论】:

              • 你会为此包含一个完整的库吗?
              • 是的,我们必须使用头盔库。如果您使用的是 expressjs fremework,那么您可以通过此代码来避免库 app.disable("x-powered-by");
              【解决方案10】:

              这些都不适合我,除了这个(你需要添加另一个参数):

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

              我正在使用 Express ^4.17

              【讨论】:

                【解决方案11】:

                有时顶部的答案不起作用。这是我的情况。我有 Express 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 版本 4.16.3。没有其他解决方案有效。
                • 谢谢,使用“express”:“^4.17.1”
                【解决方案12】:

                我也没有标准解决方案工作者。经过大量搜索,我发现我们使用了一个路由文件,其中启动了一个新的 express 实例,后来使用 app.use 将其添加到第一个文件中。只有在这个新的 express 实例中的路由存在 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();
                

                【讨论】:

                  【解决方案13】:

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

                  注意 2:缺少一些重要的东西:如果您在前端检查标头,使用开发服务器,是 Angular、React 或 webpack 开发服务器,您仍然会看到标题。这是因为 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) 使用helmet 将其删除,同时配置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-react-app)仍然会在后台使用 webpack-dev-server。

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-06-01
                    • 2023-03-31
                    • 2012-10-14
                    • 1970-01-01
                    相关资源
                    最近更新 更多