Sails.JS HTTP + HTTPS

J'essaie de comprendre comment soulever une application de voiles qui répond aux demandes HTTP et HTTPS. J'ai utilisé la méthode config / local.js pour configurer express like so (détaillé ici ):

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') }} }; 

Cependant, pendant que cela fonctionne, il en résulte que le serveur ne peut servir que les requêtes HTTPS. Est-ce que quelqu'un a compris comment procéder, sans créer un serveur HTTP distinct qui redirige vers le port 443?

Merci

J'ai pu accéder à http et https avec des voiles en modifiant mon fichier configs / local.js:

 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; 

Maintenant, vous devrez exécuter votre application de voiles deux fois. La première fois tapez votre commande de sails lift régulière. La deuxième fois, course sails lift --https

Cela devrait vous permettre d'utiliser les serveurs http et https hors de la même base de code. Comme d'autres personnes l'ont mentionné, nginx est une solution beaucoup mieux pour gérer ce genre de problème, mais si vous faites un développement local et ne souhaitez pas installer nginx, la solution ci-dessus est bien.

Pour avoir HTTP et HTTPS, évitez la manière de redirection:

Configurez votre clé SSL et cert et HTTPS dans votre /config/env/production.js :

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

Ensuite, écoutez le port 80 avec un deuxième serveur HTTP dans /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 ); // ... }; 

Vérifiez ceci: 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(); }; 

Si vous utilisez les voiles 0.10.x, vous devrez peut-être déplacer ceci vers module.exports.express (config / express.js) Je ne suis pas sûr …

Comme une mise à jour de 0,9 à 0,10, le fichier local.js devrait maintenant avoir

 ssl : { key: fs.readFileSync('server.key'), cert: fs.readFileSync('server.crt') } 

au lieu de

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

Ne semble pas qu'il existe une façon de le faire dans les voiles en ce moment, alors j'ai finalement utilisé nginx sur le serveur et créé une règle de redirection pour HTTP-> HTTPS.

Vous devez vous occuper de SSL et HTTPS , si les deux utilisent le même port par proxy.

 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); 

1-Décommenter le chemin d'accès à vos certificats SSL dans votre local.js ou ajouter un chemin d'accès à vos certificats SSL dans votre 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 } 

2-Ajoutez une section de politique dans votre 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-Créez une stratégie isHTTPS.js dans votre dossier api / policy. Cette politique redirige la requête HTTP vers 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-Ensuite, nous allons éditer le fichier config / bootstrap.js et écouter le port 80 si l'environnement est en cours de production, afin que nous puissions rediriger les requêtes vers 443, c'est-à-dire 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(); } 

Je me demandais pour l'exécution de sailsjs sur HTTPS et après être aller et venir ici est la solution qui fonctionne pour moi.

  1. J'ai copié le fichier .crt et .key dans le répertoire de projet sous le dossier ssl
  2. Config / local.js mis à jour avec les suivis alors que j'utilise sailsjs 0.12.3

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