Ab heute, dem 10. Oktober 2014 , mit Heroku Cedar Stack und ExpressJS ~ 3.4.4 , ist hier ein funktionierender Satz von Code.
Die Hauptsache, an die wir uns erinnern sollten, ist, dass wir Heroku einsetzen. Die SSL-Beendigung erfolgt am Load Balancer, bevor der verschlüsselte Datenverkehr Ihre Knoten-App erreicht. Es ist möglich zu testen, ob https verwendet wurde, um die Anforderung mit req.headers ['x-forwarded-proto'] === 'https' zu stellen .
Wir müssen uns nicht darum kümmern, lokale SSL-Zertifikate in der App usw. zu haben, wie Sie es vielleicht tun, wenn Sie in anderen Umgebungen hosten. Sie sollten jedoch zuerst ein SSL-Add-On über Heroku-Add-Ons anwenden lassen, wenn Sie Ihr eigenes Zertifikat, Ihre eigenen Subdomains usw. verwenden.
Fügen Sie dann einfach Folgendes hinzu, um die Umleitung von etwas anderem als HTTPS zu HTTPS durchzuführen. Dies kommt der oben akzeptierten Antwort sehr nahe, aber:
- Stellt sicher, dass Sie "app.use" verwenden (für alle Aktionen, nicht nur get)
- Externalisiert die forceSsl-Logik explizit in eine deklarierte Funktion
- Verwendet '*' nicht mit "app.use" - dies ist tatsächlich fehlgeschlagen, als ich es getestet habe.
- Hier möchte ich nur SSL in der Produktion. (Ändern Sie nach Ihren Wünschen)
Code:
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...
}
Hinweis für Benutzer von SailsJS (0.10.x). Sie können einfach eine Richtlinie (erzwingenSsl.js) in API / Richtlinien erstellen:
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();
}
};
Verweisen Sie dann zusammen mit anderen Richtlinien auf config / Policies.js, z.
'*': ['authentifiziert', 'erzwingenSsl']
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })