На сьогодні, 10 жовтня 2014 року , використовуючи стек Heroku Cedar та ExpressJS ~ 3.4.4 , ось робочий набір коду.
Тут головне пам’ятати, що ми МОЄМО розгортаємось до Хероку. Закінчення 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). Ви можете просто створити політику (impoceSsl.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 разом з будь-якими іншими полісами, наприклад:
'*': ['автентифіковано', 'прымуситиSsl']
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })