На моем балансировщике нагрузки я завершаю HTTPS-соединения с Nginx, а затем проксирую запрос на один из веб-серверов, которые также поддерживаются Nginx.
На балансировщике нагрузки в fastcgi_params у меня есть:
fastcgi_param HTTPS $https;
На веб-серверах есть сайт, доступ к которому возможен только по HTTPS. Как я могу определить, установлен ли параметр HTTPS и нет ли перенаправления на защищенную версию сайта?
Если я правильно вас понял, ваша установка выглядит примерно так:
клиент - (http / https) -> nginx (спереди) - (http) -> nginx (сзади) - (fastcgi) -> приложение
На самом деле существует 3 разных места, где может выполняться перенаправление:
На переднем сервере Nginx вы можете просто перенаправить, когда это необходимо:
if ( $https != 'on' ) {
return 301 https://$host$request_uri;
}
Если вы не можете сделать это на переднем сервере Nginx, вам необходимо передать информацию об используемом протоколе для резервного экземпляра Nginx. Обычно используется заголовок X-Forwarded-Proto. Вы должны добавить в соответствующее место на вашем переднем сервере Nginx:
proxy_set_header X-Forwarded-Proto $scheme;
Затем вы можете сделать перенаправление на задний сервер Nginx:
if ( $http_x_forwarded_proto != 'https' ) {
return 301 https://$host$request_uri;
}
Очевидно, вы также можете обрабатывать перенаправление внутри приложения. У вас должен быть заголовок X-Forwarded-Proto, доступный в приложении, или вы можете установить его как параметр fastcgi:
Где-то в http {}
map $http_x_forwarded_proto $fe_https {
default off;
https on;
}
И дополнительное отображение:
fastcgi_param HTTPS $fe_https;
Лично я считаю, что перенаправление должно выполняться как можно раньше в цепочке.