На сегодняшний день, 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). Вы можете просто создать политику (enforceSsl.js) внутри api / policy:
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 / policy.js вместе с любыми другими политиками, например:
'*': ['аутентифицирован', 'enforceSsl']
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })