Na dzień dzisiejszy, 10 października 2014 r. , Przy użyciu stosu Heroku Cedar i ExpressJS ~ 3.4.4 , mamy działający zestaw kodu.
Najważniejszą rzeczą do zapamiętania jest to, że wdrażamy się do Heroku. Zakończenie SSL następuje w module równoważenia obciążenia, zanim zaszyfrowany ruch dotrze do aplikacji węzła. Możliwe jest sprawdzenie, czy do wysłania żądania został użyty protokół https za pomocą req.headers ['x-forwarded-proto'] === 'https' .
Nie musimy martwić się posiadaniem lokalnych certyfikatów SSL w aplikacji itp., Jak w przypadku hostingu w innych środowiskach. Jednak jeśli używasz własnego certyfikatu, subdomen itp., Powinieneś najpierw uzyskać dodatek SSL zastosowany za pośrednictwem dodatków Heroku.
Następnie po prostu dodaj poniższe, aby wykonać przekierowanie z czegokolwiek innego niż HTTPS do HTTPS. Jest to bardzo zbliżone do zaakceptowanej odpowiedzi powyżej, ale:
- Zapewnia, że używasz „app.use” (do wszystkich działań, a nie tylko do pobierania)
- Jawnie uzewnętrznia logikę forceSsl do zadeklarowanej funkcji
- Nie używa znaku „*” z „app.use” - to faktycznie zawiodło, kiedy go testowałem.
- Tutaj chcę tylko SSL w produkcji. (Zmień zgodnie z własnymi potrzebami)
Kod:
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...
}
Uwaga dla użytkowników SailsJS (0.10.x). Możesz po prostu utworzyć politykę (egzekwowanieSsl.js) wewnątrz interfejsu API / polityk:
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();
}
};
Następnie odwołaj się do pliku config / policies.js wraz z innymi zasadami, np .:
„*”: [„uwierzytelniony”, „wymuszonySsl”]
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })