Ad oggi, 10 ottobre 2014 , utilizzando lo stack Heroku Cedar e ExpressJS ~ 3.4.4 , ecco un set di codice funzionante.
La cosa principale da ricordare qui è che STIAMO distribuendo su Heroku. La terminazione SSL avviene al bilanciamento del carico, prima che il traffico crittografato raggiunga l'app del nodo. È possibile verificare se https è stato utilizzato per effettuare la richiesta con req.headers ['x-forwarded-proto'] === 'https' .
Non dobbiamo preoccuparci di avere certificati SSL locali all'interno dell'app, ecc. Come potresti fare se ospitassi in altri ambienti. Tuttavia, dovresti prima ottenere un componente aggiuntivo SSL applicato tramite i componenti aggiuntivi Heroku se utilizzi il tuo certificato, sottodomini ecc.
Quindi aggiungi semplicemente quanto segue per eseguire il reindirizzamento da qualsiasi cosa diversa da HTTPS a HTTPS. Questo è molto vicino alla risposta accettata sopra, ma:
- Assicura di utilizzare "app.use" (per tutte le azioni, non solo per get)
- Esternalizza esplicitamente la logica forceSsl in una funzione dichiarata
- Non usa "*" con "app.use" - in realtà non è riuscito quando l'ho testato.
- Qui, voglio solo SSL in produzione. (Cambia in base alle tue esigenze)
Codice:
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 per gli utenti di SailsJS (0.10.x). Puoi semplicemente creare una policy (enforceSsl.js) all'interno di 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();
}
};
Quindi fare riferimento da config / policies.js insieme a qualsiasi altra politica, ad esempio:
'*': ['authenticated', 'enforceSsl']
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })