Sails.JS HTTP + HTTPS

11

我正在尝试弄清如何提升一个能响应HTTP和HTTPS请求的 sails 应用。我使用了 config/local.js 的方法来配置 express,像这样(详细情况在此):

 var fs = require('fs');

module.exports = {

  port: process.env.PORT || 1337,
  environment: process.env.NODE_ENV || 'development',

  express: { serverOptions : {
    key: fs.readFileSync('ssl/key.pem'),
    cert: fs.readFileSync('ssl/cert.pem')
  }}

};

然而,虽然这种方法可以使用,但它会导致服务器能够服务于HTTPS请求。有没有人想出如何完成此操作,而无需创建一个单独的HTTP服务器来重定向到443端口?

谢谢。


问题:你的最终目标是将http重定向到https吗?换句话说,如果有人输入http://example.com,他们会被重定向到https://example.com。如果是这种情况,你可以在sailsjs之外以几种不同的方式实现。 - NDBoost
最终,我只是在服务器上使用了 nginx,并创建了一个 HTTP -> HTTPS 的重定向规则。 - MOneSixInCode
这正是我要建议的,因为在生产环境中,使用Nginx可能是为SailsJS应用程序提供服务的首选方法。 - NDBoost
这可能会有所帮助:http://jsbot.io/node/http-and-https-handle-with-sailsjs - Nishchit
8个回答

6

1-取消注释本地.js中的SSL证书路径或在config/env/production.js中添加SSL证书路径。

    module.exports  = {
 ssl: {
     ca: require('fs').readFileSync(__dirname + '/ssl/ca.crt'),
     key: require('fs').readFileSync(__dirname + '/ssl/key.key'),
     cert: require('fs').readFileSync(__dirname + '/ssl/cert.crt')
   },
 port: 443
}

2-在 config/env/production.js 中添加一个策略(policies)部分

    module.exports  = {
 ssl: {
     ca: require('fs').readFileSync(__dirname + '/ssl/ca.crt'),
     key: require('fs').readFileSync(__dirname + '/ssl/key.key'),
     cert: require('fs').readFileSync(__dirname + '/ssl/cert.crt')
   },
 port: 443,
 policies: {
    '*': 'isHTTPS'
   }
}

3-在您的api/policies文件夹中创建一个isHTTPS.js策略。该策略将把HTTP请求重定向到HTTPS。

  module.exports = function(req, res, next) {
    if (req.secure) {
        // Already https; don't do anything special.
        next();
    } else {
        // Redirect to https.
        res.redirect('https://' + req.headers.host + req.url);
    }
};

4-接下来,我们需要编辑config/bootstrap.js文件,并在环境为生产环境时监听端口80,以便将请求重定向到443端口即SSL。

    var http = require( 'http' );
module.exports.bootstrap = function(cb) {
    //If the environment is production, then listen on port 80 
    if(sails.config.environment === "production") {
        http.createServer( sails.hooks.http.app ).listen( 80 );        
    }
    cb();
}

3

同时具备HTTP和HTTPS,避免重定向的方式:

/config/env/production.js中配置SSL密钥和证书以及HTTPS端口

var fs = require( 'fs' );
module.exports = {
    port: 443,
    ssl: {
        key: fs.readFileSync( 'ssl_key.key' ),
        cert: fs.readFileSync( 'ssl_key.crt' )
    }
    //, ...
};

接下来,在 /config/bootstrap.js 中添加一个第二个HTTP服务器,用于侦听80端口

var http = require( 'http' );
module.exports.bootstrap = function ( cb ) {
    // ...
    if ( process.env.NODE_ENV == 'production' )
        http.createServer( sails.hooks.http.app ).listen( 80 );
    // ...
};

3
我通过修改config/local.js文件,成功启用了Sails的http和https功能:
var fs = require('fs');
var local = ... // Your default local.js settings should go here
if(require('optimist').argv.https) {
    local.express = {
        serverOptions : {
            key: fs.readFileSync('ssl/server.key'),
            cert: fs.readFileSync('ssl/server.crt')
        }
    };
    local.port = 1338; // This port should be different than your default port
}
module.exports = local;

现在你需要运行 sails 应用两次。第一次输入常规的 sails lift 命令。第二次运行 sails lift --https
这样可以让 http 和 https 服务器同时运行于同一代码库。正如其他人提到的,nginx 是处理此类问题更好的解决方案,但是如果你正在进行本地开发并且不想安装 nginx,上述解决方案也是可以的。

3

我一直在思考如何在Sailsjs上运行HTTPS,经过反复试验,以下是适用于我的解决方案。

  1. 我将.crt和.key文件复制到项目目录下的ssl文件夹中
  2. 由于我使用的是sailsjs 0.12.3,因此在config/local.js中更新了以下内容:

    
    ssl: {
      key: require('fs').readFileSync(require('path').resolve(__dirname + '/ssl/mykey.key')),
      cert: require('fs').readFileSync(require('path').resolve(__dirname + '/ssl/mycert.crt'))
    }
    
    
    

2
作为从0.9升级到0.10的更新,local.js文件现在应该有:
ssl : {
key: fs.readFileSync(‘server.key’),
cert: fs.readFileSync(‘server.crt’)
}

代替
express : {
        serverOptions : {
            key: fs.readFileSync('ssl/server.key'),
            cert: fs.readFileSync('ssl/server.crt')
        }
    };

2
请看这个链接:https://github.com/balderdashy/sails/issues/862
module.exports.bootstrap = function (cb) {
    var express = require("express"),
         app = express();

    app.get('*', function(req,res) {  
        res.redirect('https://' + req.headers.host + req.url)
    }).listen(80);

    cb();
};

如果您正在使用 sails 0.10.x,则可能需要将此移动到 module.exports.express(config/express.js)。我不确定...

以上代码在Sails 0.11.x中无法工作。你有其他的解决方案吗? - rash111

1

如果两者通过代理使用相同的端口,则必须注意SSLHTTPS

var express = require("express"),
     app = express();

app.get('*', function(req,res) {  

    if(req.isSocket){           
        return res.redirect('wss://' + req.headers.host + req.url)  
    }
    else{
        return res.redirect('https://' + req.headers.host + req.url)    
    }

}).listen(80);

在Sails.js项目中,您要将该代码插入到哪里? - Suisse

1

目前看来,Sails 框架内部似乎没有这样的方法,因此我最终在服务器上使用了 nginx,并创建了一个 HTTP->HTTPS 的重定向规则。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接