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

переписать http на https с nginx за балансировщиком нагрузки

Я использую балансировщик нагрузки Rackspace, который позволяет мне настроить свой ssl-ключ / pem внутри панели администратора. Все работает нормально, могу использовать как протоколы http, так и https. Но если я попытаюсь перенаправить http на https, используя:

server{
  listen *:80;
  server_name mydomain.com www.mydomain.com; 
  rewrite ^ https://mydomain.com$request_uri? permanent;

... Я получаю цикл перенаправления. Я понимаю, что не слушаю порт 443, но это потому, что балансировщик нагрузки сделал это за меня. Я также пробовал обернуть перезапись в if ($scheme ~* http){но безрезультатно.

Другая часть моего вопроса заключается в том, что я хотел бы удалить www из URL-адреса, могу ли я сделать это с помощью одной перезаписи? Не следует ли об этом позаботиться и вышеупомянутый перезапись?

Спасибо за вашу помощь!

Используя встроенные серверные переменные nginx $request_uri и $server_name вы можете сделать это вообще без использования регулярных выражений. Добавьте следующее к вашему серверу location блок и все готово:

if ($http_x_forwarded_proto = "http") {
    return 301 https://$server_name$request_uri;
}

Предполагается, что ваш балансировщик нагрузки отправляет $http_x_forwarded_proto заголовок вместе с запросом к вашему экземпляру (-ам) серверной части. Другие распространенные заголовки включают $http_x_forwarded_scheme а также просто $scheme.

Более подробную информацию можно найти в nginx Подводные камни и распространенные ошибки документация : https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites

sciurus верен в том, что облачные балансировщики нагрузки Rackspace устанавливают для X-Forwarded-Proto значение https, когда SSL выгружается на балансировщике нагрузки. Чтобы избежать цикла перенаправления в nginx, вы должны иметь возможность добавить следующее в location раздел в конфигурации vhost:

if ($http_x_forwarded_proto = "http") {
            rewrite  ^/(.*)$  https://mydomain.com/$1 permanent;
}

Это должно избежать бесконечного цикла перенаправления при перенаправлении запросов, отличных от https, на https.

Балансировщик нагрузки всегда разговаривает с вами по http. Что происходит

  1. Браузер делает запрос на порт 80 балансировщика нагрузки.
  2. Балансировщик нагрузки делает запрос к порту 80 на вашем веб-сервере.
  3. Ваш веб-сервер отправляет перенаправление пользователю
  4. Пользователь делает запрос к порту 443 на балансировщике нагрузки.

Шаги 2–4 повторяются, пока браузер не обнаружит петлю перенаправления и не откажется от нее.

РЕДАКТИРОВАТЬ: Чтобы решить эту проблему, выполняйте перезапись только тогда, когда заголовок X-Forwarded-Proto установлен на http. С помощью этого заголовка балансировщик нагрузки Rackspace сообщает вашему веб-серверу протокол, по которому он получил запрос.