Actualmente tengo un ELB que sirve tanto a http://www.example.org como a https://www.example.org .
Me gustaría configurarlo para que cualquier solicitud que apunte a http://www.example.org se redirija a https://www.example.org .
El ELB envía las solicitudes https como solicitudes http, por lo que utiliza:
server {
listen 80;
server_name www.example.org;
rewrite ^ https://$server_name$request_uri? permanent;
}
no funcionará porque las solicitudes realizadas a https://www.example.org aún se realizarán en el puerto 80 en nginx.
Sé que es posible reescribirlo como
server {
listen 80;
server_name www.example.org;
if ($http_x_forwarded_proto != "https") {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
}
Pero todo lo que he leído dice que if
debe evitarse a toda costa dentro de la configuración de nginx, y esto sería para cada solicitud. Además, significa que tengo que configurar una configuración especial especial para la comprobación de estado ( como se describe aquí : "... cuando está detrás de un ELB, donde el ELB actúa como el punto final HTTPS y solo envía tráfico HTTP a su servidor, usted romper la capacidad de responder con una respuesta HTTP 200 OK para la comprobación de estado que necesita el ELB ").
Estoy considerando poner el inicio de sesión en el código de la aplicación web en lugar de la configuración nginx (y para los fines de esta pregunta, supongamos que es una aplicación basada en Django), pero no estoy seguro de si eso sería más costoso que En la if
configuración.
Respuestas:
Si funciona correctamente así, no tengas miedo. http://wiki.nginx.org/IfIsEvil
fuente
location {}
, en suserver {}
lugar. (¡Pero avíseme si esto es incorrecto!)Configuración NGINX
fuente
HTTP:1443
. Rechaza elHTTP:80
porque la redirección 301.Esta solución usa lógica condicional, pero como sugiere la respuesta aceptada, también creo que esto está bien. Ref: /programming/4833238/nginx-conf-redirect-multiple-conditions
Además, esto no requiere abrir ningún puerto adicional en la configuración de seguridad de aws para la imagen. Puede terminar ssl en AWS LB y enrutar el tráfico https al puerto http 80 en su instancia.
En este ejemplo, la comprobación de estado de LB coincide con el estado en el puerto 80 que se dirige al servidor de aplicaciones, por lo que la comprobación de estado valida tanto nginx como su aplicación están respirando.
fuente
Ahora puede crear un nuevo oyente en la configuración de AWS Load Balancer que redirige el puerto HTTP 80 al puerto 443. HTTPS. Por lo tanto, ya no necesita tocar la configuración nginx / apache.
fuente