【问题标题】:Force http:// to https:// in a sails.js App在sails.js 应用程序中强制http:// 到https://
【发布时间】:2017-08-30 03:58:33
【问题描述】:

我尝试将托管在 heroku(未安装 nginx)上的 Sails.js WebApp 从 http:// 强制转换为 https:// 并在我的sails.js 应用中使用此 express middleware

在 Express 中它看起来像这样:

app.use(forceDomain({
  hostname: 'www.example.com',
  port: 4000,
  protocol: 'https'
}));

我尝试在我的sails.js 应用程序的config/http.js 文件中使用它:

middleware: {

        forceDomain: function (req, res, next) {
            forceDomain({
                hostname: 'www.myurl.com',
                port: 4000,
                protocol: 'https'
            });
            next();
        },

        order: [
            'forceDomain',
          ...
}

我不明白如何在sails.js 中使用这个“app.use()”。 是here explained,但我不太明白。我现在拥有的东西不起作用(没有错误,但也没有重定向)。我该如何解决这个问题?

已安装 this module - 也不起作用。

【问题讨论】:

  • 我觉得应该是 forceDomain: forceDomain({hostname...etc}),
  • 不,这根本没有意义。嗯
  • 如果您使用的是 nginx(作为反向代理),您可以在那里进行。
  • 我不使用 ngingx
  • 我使用了相同的 @PomeGranate 方法,但我将其包装在自定义策略中,以保持代码的清洁和模块化,并仅在选定的方法上实现重定向。缺点是,如果您想在所有应用程序 api 中使用 https,您也必须在策略配置中的所有方法上对其进行管理

标签: javascript node.js express ssl sails.js


【解决方案1】:

以下是如何在没有 nginx 且没有外部模块的情况下在 heroku 上运行的sails.js 应用程序上强制使用 ssl 的解决方案:

在 config/http.js 文件中有一个自定义中间件的例子:

****************************************************************************
*      Example custom middleware; logs each request to the console.        *  
****************************************************************************

myRequestLogger: function (req, res, next) {
        console.log("Requested :: ", req.method, req.url);
        next();
 }

我创建了自己的自定义中间件函数来控制请求是否安全,如果不安全,它将请求重定向到 https://,或者如果它是 websocket 请求,它将请求重定向到 wss://

 order: [
         ...
         'forceSSL',
          ...
         ],


forceSSL: function (req, res, next) {

            if (req.isSocket) {
                return res.redirect('wss://' + req.headers.host + req.url);
            } else if (req.headers["x-forwarded-proto"] == "http") {
                return res.redirect('https://' + req.headers.host + req.url);
            } else {
                next(); //it's already secure
            }
}

不需要外部模块或连接。只是那个功能,它就可以工作。

【讨论】:

  • 感谢分享,您是否需要做一些特别的事情才能让 websocket 正常工作?我还在使用他们的应用程序负载平衡器在aws上运行没有nginx的sails.js(在docker中)并得到“WebSocket握手期间出错:意外的响应代码:502”。使用 1 个实例 websocket 工作正常,但是一旦我添加 2 个或更多实例,我就会开始断开连接......
【解决方案2】:

sails.config.http.middleware 字典中的每个值(order 除外)都应该是 Express 样式的中间件函数——即接受 reqresnext 的函数,这正是forcedomain 模块返回什么。您的代码中的问题是您将该函数包装在另一个函数中,而不是仅仅返回它。试试:

middleware: {

    forceDomain: forceDomain({
      hostname: 'www.myurl.com',
      port: 4000,
      protocol: 'https'
    }), // <-- the call to `forceDomain()` returns a configured Express middleware fn.

    order: [
      'forceDomain',
      ...
}

这假设您在该文件的顶部有var forceDomain = require('forcedomain')

【讨论】:

  • 感谢您的解决方案。似乎是正确的,但在我的应用程序中不起作用。我没有错误,但重定向没有发生。那么如何在sails.js 中解决这个重定向的事情呢??
  • forcedomain 模块不是我编写的,也不能真正保证它会做它声称要做的事情,但如果它能够工作,那就是你的做法!
  • 是的,您的解决方案看起来是正确的。谢谢 :) 我在没有模块的情况下解决了它。
猜你喜欢
  • 1970-01-01
  • 2019-05-01
  • 2014-03-03
  • 2020-04-06
  • 2020-08-09
  • 2014-08-15
  • 2016-11-14
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多