Intento forzar mi aplicación web Sails.js que está alojada en heroku (sin nginx instalado) de http:// a https:// y uso este middleware express en mi aplicación sail.js:
En Express se vería así:
app.use(forceDomain({ hostname: 'www.example.com', port: 4000, protocol: 'https' }));Traté de usarlo en mi archivo config/http.js en mi aplicación sails.js:
middleware: { forceDomain: function (req, res, next) { forceDomain({ hostname: 'www.myurl.com', port: 4000, protocol: 'https' }); next(); }, order: [ 'forceDomain', ... }No entiendo exactamente cómo usar esta cosa "app.use ()" en sails.js. Está aquí explicado , pero realmente no entendí. Lo que tengo ahora no funciona (no hay errores, pero tampoco redirección). ¿Cómo puedo arreglar esto?
Instalado este módulo , tampoco funciona.
Aquí está la solución de cómo forzar SSL en una aplicación sails.js que se ejecuta en heroku sin nginx y sin módulos externos:
En el archivo config/http.js hay un ejemplo de middleware personalizado:
**************************************************************************** * Example custom middleware; logs each request to the console. * **************************************************************************** myRequestLogger: function (req, res, next) { console.log("Requested :: ", req.method, req.url); next(); }Hice mi propia función de middleware personalizada que controla si la solicitud es segura y, de no ser así, redirige la solicitud a https:// o, si es una solicitud de websocket, redirige la solicitud a 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 } }No hay necesidad de módulos externos o conexiones. solo esa función y funciona.
Cada valor en el diccionario sails.config.http.middleware (además de order ) debe ser una función de middleware de estilo Express, es decir, una función que acepta req , res y next , que es exactamente lo que devuelve el módulo forcedomain . El problema en su código es que está envolviendo esa función en otra función en lugar de simplemente devolverla. Probar:
middleware: { forceDomain: forceDomain({ hostname: 'www.myurl.com', port: 4000, protocol: 'https' }), // <-- the call to `forceDomain()` returns a configured Express middleware fn. order: [ 'forceDomain', ... } ¡Esto supone que tiene var forceDomain = require('forcedomain') en la parte superior de ese archivo!