Existem várias formas de analisar o protocolo de uma requisição em Node.js, mas a grande maioria delas não é compatível com arquiteturas que usam balanceadores de carga. O balanceador de carga fica como intermediário entre a requisição do cliente e o servidor web, sendo ele o responsável por abrir a conexão com o servidor. Da forma tradicional, o servidor web só consegue saber o protocolo usado pela requisição do balanceador de carga, mas o protocolo importante para saber quando fazer ou não o redirecionamento para HTTPS, é usado pelo cliente em relação ao balanceador de carga.
Como essa informação é importante, a Umbler configura seus balanceadores de carga para armazenarem o protocolo da requisição no cabeçalho X-Forwarded-Proto. Em seu código é possível recuperar essa informação contida no cabeçalho, e caso o valor seja diferente de “https”, redirecionar para uma URL que use o protocolo HTTPS, do contrário, seguir com o fluxo normal da aplicação. Para deixar mais claro, temos um exemplo usando o framework Express.
app.get('*', (req, res, next) => {
if (req.headers['x-forwarded-proto'] != 'https') {
// checa se o header é HTTP ou HTTPS
res.redirect("https://" + req.headers.host + req.url);
// faz o redirect para HTTPS
} else {
next();
// segue com a sequência das rotas
}
});