A partir de hoje, 10 de outubro de 2014 , usando a pilha Heroku Cedar e ExpressJS ~ 3.4.4 , aqui está um conjunto de código de trabalho.
A principal coisa a lembrar aqui é que ESTAMOS implantando no Heroku. A terminação SSL ocorre no balanceador de carga, antes que o tráfego criptografado alcance seu aplicativo de nó. É possível testar se https foi usado para fazer a solicitação com req.headers ['x-forwarded-proto'] === 'https' .
Não precisamos nos preocupar em ter certificados SSL locais dentro do aplicativo, etc., como você faria se estivesse hospedando em outros ambientes. No entanto, você deve obter um complemento SSL aplicado por meio de complementos do Heroku primeiro, se estiver usando seu próprio certificado, subdomínios etc.
Em seguida, basta adicionar o seguinte para fazer o redirecionamento de qualquer coisa diferente de HTTPS para HTTPS. Isso está muito próximo da resposta aceita acima, mas:
- Garante que você use "app.use" (para todas as ações, não apenas para obter)
- Externiza explicitamente a lógica forceSsl em uma função declarada
- Não usa '*' com "app.use" - isso realmente falhou quando testei.
- Aqui, quero apenas SSL em produção. (Mude de acordo com suas necessidades)
Código:
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...
}
Nota para usuários SailsJS (0.10.x). Você pode simplesmente criar uma política (enforceSsl.js) dentro de api / políticas:
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();
}
};
Em seguida, faça referência a config / policies.js junto com quaisquer outras políticas, por exemplo:
'*': ['autenticado', 'enforceSsl']
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })