На сегодняшний день, 10 октября 2014 , используя стек Heroku Cedar и ExpressJS ~ 3.4.4 , вот рабочий набор кода.
Главное, что нужно помнить, это то, что мы развертываем на Heroku.Завершение SSL происходит на балансировщике нагрузки, прежде чем зашифрованный трафик достигнет вашего узла приложения.Можно проверить, использовался ли https для выполнения запроса, с помощью req.headers ['x-forwarded-proto'] === 'https' .
Нам не нужнозаботиться о наличии локальных SSL-сертификатов внутри приложения и т. д., как если бы вы размещались в других средахТем не менее, вы должны сначала получить надстройку SSL с помощью надстроек Heroku, если используете собственный сертификат, поддомен и т. Д.
Затем просто добавьте следующее, чтобы выполнить перенаправление из чего-либо, кроме HTTPS, в HTTPS.,Это очень близко к принятому ответу выше, но:
- Гарантирует, что вы используете "app.use" (для всех действий, а не только для получения)
- Явно экстернализуетЛогика forceSsl в объявленной функции
- Не использует '*' с "app.use" - это на самом деле не удалось, когда я проверял это.
- Здесь я хочу только SSL в производстве.(Изменить в соответствии с вашими потребностями)
Код:
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...
}
Примечание для пользователей SailsJS (0.10.x).Вы можете просто создать политику (forceceSsl.js) внутри api /icies:
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();
}
};
Затем ссылаться на config /icies.js вместе с любыми другими политиками, например:
'*': ['authenticated', 'forceceSsl']