在sails.js应用程序中强制http://到https://

时间:2017-04-04 19:21:36

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

我尝试强制将我的Sails.js WebApp托管在heroku上(没有安装nginx)从http://到https://并在我的sail.js app中使用此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',
          ...
}

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

已安装this module - 也无效。

2 个答案:

答案 0 :(得分:3)

以下是如何在没有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
            }
}

无需外部模块或连接。只是那个功能,它的工作原理。

答案 1 :(得分:2)

sails.config.http.middleware字典中的每个值(order除外)都应该是Express风格的中间件函数 - 即接受reqres的函数,和next,这正是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')