A partir de hoy, 10 de octubre de 2014 , usando la pila Heroku Cedar y ExpressJS ~ 3.4.4 , aquí hay un conjunto de código de trabajo.
Lo principal para recordar aquí es que ESTAMOS implementando en Heroku. La terminación de SSL ocurre en el balanceador de carga, antes de que el tráfico cifrado llegue a su aplicación de nodo. Es posible probar si se utilizó https para realizar la solicitud con req.headers ['x-fordered-proto'] === 'https' .
No es necesario que nos preocupemos por tener certificados SSL locales dentro de la aplicación, etc., como lo haría si estuviera alojando en otros entornos. Sin embargo, primero debe aplicar un complemento SSL a través de los complementos de Heroku si usa su propio certificado, subdominios, etc.
Luego, simplemente agregue lo siguiente para hacer la redirección de cualquier cosa que no sea HTTPS a HTTPS. Esto está muy cerca de la respuesta aceptada anterior, pero:
- Garantiza que utilice "app.use" (para todas las acciones, no solo para obtener)
- Externaliza explícitamente la lógica forceSsl en una función declarada
- No usa '*' con "app.use" - esto realmente falló cuando lo probé.
- Aquí, solo quiero SSL en producción. (Cambie según sus necesidades)
Código:
var express = require('express'),
env = process.env.NODE_ENV || 'development';
var forceSsl = function (req, res, next) {
if (req.headers['x-forwarded-proto'] !== 'https') {
return res.redirect(['https://', req.get('Host'), req.url].join(''));
}
return next();
};
app.configure(function () {
if (env === 'production') {
app.use(forceSsl);
}
// other configurations etc for express go here...
}
Nota para los usuarios de SailsJS (0.10.x). Simplemente puede crear una política (enforceSsl.js) dentro de api / policies:
module.exports = function (req, res, next) {
'use strict';
if ((req.headers['x-forwarded-proto'] !== 'https') && (process.env.NODE_ENV === 'production')) {
return res.redirect([
'https://',
req.get('Host'),
req.url
].join(''));
} else {
next();
}
};
Luego, haga referencia a config / policies.js junto con cualquier otra política, por ejemplo:
'*': ['autenticado', 'enforceSsl']
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })