我正试图弄清楚如何提升一个同时响应HTTP和HTTPS请求的sails应用程序。我使用config/local.js方法配置了如下所示的表达式(详细的here):
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?
谢谢
发布于 2016-05-25 01:09:21
1-在local.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中添加一个策略部分
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/ 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();
}
发布于 2014-02-22 13:54:59
通过修改/local.js文件,我能够让http和https在sails中运行:
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 lift
命令。第二次运行sails lift --https
这应该允许您在相同的代码基上运行http和https服务器。正如其他人所提到的,nginx是处理这类问题的更好的解决方案,但是如果您正在进行本地开发,并且不想安装nginx,那么上面的解决方案就很好了。
发布于 2015-12-17 06:46:29
要同时拥有HTTP和HTTPS,可以避免重定向方式:
在/config/env/production.js中配置您的SSL密钥& cert和HTTPS端口
var fs = require( 'fs' );
module.exports = {
port: 443,
ssl: {
key: fs.readFileSync( 'ssl_key.key' ),
cert: fs.readFileSync( 'ssl_key.crt' )
}
//, ...
};
然后,使用第二个服务器侦听端口80到/config/bootstrap.js
var http = require( 'http' );
module.exports.bootstrap = function ( cb ) {
// ...
if ( process.env.NODE_ENV == 'production' )
http.createServer( sails.hooks.http.app ).listen( 80 );
// ...
};
https://stackoverflow.com/questions/21612738
复制