Aquí está mi abreviada nginx vhost conf:
upstream gunicorn {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 80;
listen 443 ssl;
server_name domain.com ~^.+\.domain\.com$;
location / {
try_files $uri @proxy;
}
location @proxy {
proxy_pass_header Server;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 120;
proxy_pass http://gunicorn;
}
}
El mismo servidor necesita servir tanto HTTP como HTTPS, sin embargo, cuando el flujo ascendente emite una redirección (por ejemplo, después de que se procesa un formulario), todas las solicitudes HTTPS se redirigen a HTTP. Lo único que he encontrado que corrige este problema está cambiando proxy_redirect
a lo siguiente:
proxy_redirect http:// https://;
Eso funciona de maravilla para las solicitudes que provienen de HTTPS, pero si se emite una redirección a través de HTTP, también se redirige a HTTPS, lo cual es un problema.
Por desesperación, intenté:
if ($scheme = 'https') {
proxy_redirect http:// https://;
}
Pero nginx se queja de que proxy_redirect
no está permitido aquí.
La única otra opción que se me ocurre es definir los dos servidores por separado y configurarlos proxy_redirect
solo en el SSL, pero luego habría duplicado el resto de la configuración (hay muchas cosas en la server
directiva que omití por simplicidad). Sé que también podría usar una include
directiva para factorizar la redundancia, pero realmente quiero mantener solo un archivo conf sin ninguna dependencia.
Entonces, primero, ¿hay algo que me falta que niegue el problema por completo? O, en segundo lugar, si no, ¿hay alguna otra forma (además de incluir un archivo externo) para descomponer la información de configuración redundante para que pueda separar las versiones HTTP y HTTPS de la configuración del servidor?