Назад | Перейти на главную страницу

Nginx: обнаружение HTTPS-соединения с помощью заголовка

На моем балансировщике нагрузки я завершаю 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;

Лично я считаю, что перенаправление должно выполняться как можно раньше в цепочке.