Ось мій скорочений 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;
}
}
Один і той же сервер повинен обслуговувати і HTTP, і HTTPS, однак, коли висхідний потік видає переспрямування (наприклад, після обробки форми), усі запити HTTPS переспрямовуються на HTTP. Єдине, що я виявив, що виправить це питання, - це змінити proxy_redirect
наступне:
proxy_redirect http:// https://;
Це чудово працює для запитів, що надходять від HTTPS, але якщо перенаправлення видається через HTTP, воно також перенаправляє його на HTTPS, що є проблемою.
З відчаю я спробував:
if ($scheme = 'https') {
proxy_redirect http:// https://;
}
Але nginx скаржиться, що proxy_redirect
тут заборонено.
Єдиний інший варіант, про який я можу придуматись, - це визначити два сервери окремо і встановити proxy_redirect
лише один на SSL, але тоді я б дублював решту конф server
. Я знаю, що я міг би також використовувати include
директиву, щоб визначити надмірність, але я дуже хочу зберегти лише один конф-файл без будь-яких залежностей.
Отже, по-перше, чи є щось, що мені не вистачає, що повністю зніме проблему? Або, по-друге, якщо ні, чи є інший спосіб (крім включення зовнішнього файлу) виділити зайву інформацію конфігурації, щоб я міг відокремити версії HTTP та HTTPS серверної конфігурації?