Eu tenho um aplicativo instalado e funcionando no heroku com express on node com https ,. Como faço para identificar o protocolo para forçar um redirecionamento para https com nodejs no heroku?
Meu aplicativo é apenas um servidor http simples, ele (ainda) não percebe que o heroku está enviando solicitações https:
/* Heroku provides the port they want you on in this environment variable (hint: it's not 80) */
app.listen(process.env.PORT || 3000);
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })
Respostas:
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:
Código:
Nota para usuários SailsJS (0.10.x). Você pode simplesmente criar uma política (enforceSsl.js) dentro de api / políticas:
Em seguida, faça referência a config / policies.js junto com quaisquer outras políticas, por exemplo:
fonte
res.redirect
o padrão é um redirecionamento 302 (pelo menos no expresso 4.x). Por motivos de SEO e armazenamento em cache, você provavelmente deseja um redirecionamento 301. Substitua a linha correspondente porreturn res.redirect(301, ['https://', req.get('Host'), req.url].join(''));
Express 4.x
, remova aapp.configure
linha e use apenas a poção interna.app.configure
é um código legado e não está mais incluído no expresso.A resposta é usar o cabeçalho de 'x-forwarded-proto' que Heroku passa adiante enquanto faz seu proxy thingamabob. (observação lateral: eles passam várias outras variáveis x também que podem ser úteis, verifique-as ).
Meu código:
Obrigado Brandon, estava apenas esperando aquele atraso de 6 horas que não me deixou responder minha própria pergunta.
fonte
GET
passarem?&& process.env.NODE_ENV === "production"
em seu condicional se quiser apenas que funcione em seu ambiente de produção.A resposta aceita contém um domínio codificado, o que não é muito bom se você tiver o mesmo código em vários domínios (por exemplo: dev-yourapp.com, test-yourapp.com, yourapp.com).
Em vez disso, use:
https://blog.mako.ai/2016/03/30/redirect-http-to-https-on-heroku-and-node-generally/
fonte
req.hostname
pelareq.headers.host
versão talvez expressa estou em 4.2Eu escrevi um pequeno módulo de nó que aplica SSL em projetos express. Funciona tanto em situações padrão quanto no caso de proxies reversos (Heroku, nodejitsu, etc.)
https://github.com/florianheinemann/express-sslify
fonte
Se quiser testar o
x-forwarded-proto
cabeçalho em seu localhost, você pode usar nginx para configurar um arquivo vhost que faz proxy de todas as solicitações para seu aplicativo de nó. Seu arquivo de configuração nginx vhost pode ser parecido com esteNginX
O que é importante aqui é que você está fazendo proxy de todas as solicitações para localhost porta 3000 (é onde seu aplicativo de nó está sendo executado) e está configurando um monte de cabeçalhos, incluindo
X-Forwarded-Proto
Então, em seu aplicativo, detecte esse cabeçalho como de costume
Expressar
Koa
Hosts
Finalmente você deve adicionar esta linha ao seu
hosts
arquivofonte
Você deve dar uma olhada em heroku-ssl-redirect . Ele funciona como um encanto!
fonte
Se você estiver usando cloudflare.com como CDN em combinação com heroku, você pode habilitar o redirecionamento SSL automático dentro do cloudflare facilmente assim:
Faça login e vá para o seu painel
Selecione as regras da página
fonte
Os usuários de loopback podem usar uma versão ligeiramente adaptada da resposta do arcseldon como middleware:
server / middleware / forcessl.js
server / server.js
fonte
Esta é uma maneira específica mais expressa de fazer isso.
fonte
fonte
Com app.use e url dinâmico. Funciona localmente e no Heroku para mim
fonte
Verificar o protocolo no cabeçalho X-Forwarded-Proto funciona bem no Heroku, assim como Derek apontou. Para constar, aqui está uma essência do middleware Express que uso e seu teste correspondente.
fonte