He experimentado el mismo problema, pero en un contexto ligeramente diferente. Estaba implementando la aplicación Node.js/Express utilizando AWS Elastic Beanstalk y pude instalar un certificado SSL en ella.
El resultado de esto fue que mi aplicación era accesible tanto en el protocolo http como en el protocolo https. La tabla de enrutamiento del equilibrador de carga estaban buscando de esta manera:
(Load balancer) http 80 --> (Node instance) http 8080
(Load balancer) https 443 --> (Node instance) http 8080
Así que la pregunta era para autorizar solamente https conexión en mi aplicación Node.js, pero que permite la redirección a https si la conexión se realiza mediante HTTP initialy.
Porque detrás del equilibrador de carga de AWS, toda la comunicación se realiza a través de HTTP, una instrucción de redirección mundial (como middleware en este caso) como éste crearía un bucle infinito de redirección:
app.use(function(req, res, next) {
if((!req.secure) && (req.protocol !== 'https')) {
res.redirect('https://' + req.get('Host') + req.url);
}
}
- > simplemente porque la instrucción (req.protocol !== 'https'
) siempre sería cierta.
De esta entrada de blog (http://matthew.mceachen.us/blog/howto-force-https-with-amazon-elastic-load-balancer-and-apache-1071.html), resulta que AWS ELB agrega un encabezado X-Forwarded-Proto que puede capturar para saber cuál era el protocolo utilizado antes del equilibrador de carga (http o https).
Así que esta pequeña modificación hizo el truco:
app.use(function(req, res, next) {
if((!req.secure) && (req.get('X-Forwarded-Proto') !== 'https')) {
res.redirect('https://' + req.get('Host') + req.url);
}
else
next();
});
Esperanza esta ayuda!
¿Está devolviendo enlaces 'http: //' al cliente? – arx
No puedo encontrar uno. Todas las rutas en el cliente son relativas (para llamadas ajax). – Greg
La mayoría de los navegadores tienen algunos medios para rastrear todas las llamadas desde su código, supervisar las redirecciones, etc. Ejecutaría un seguimiento y vería de dónde vienen los enlaces http (por ejemplo, desde su código o desde el otro extremo) . – arx