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


13

Я использую балансировщик нагрузки 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, могу ли я сделать это с помощью одной перезаписи? Разве вышесказанное не должно заботиться об этом?

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


Балансировщик нагрузки должен посылать вам некоторое указание того, было ли соединение HTTPS. Спросите Rackspace. (О, и вы, вероятно, не хотите избавляться от www ...)
Майкл Хэмптон

Интересно, я посмотрю на это. Как вы думаете, почему я не должен избавляться от www?
13

Ответы:


14

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

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

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


18

При использовании 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 Pitfalls и Common Mistakes : https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites.


5
Следует обязательно использовать возврат поверх переписать. Upvoted.
designermonkey

1
Вы можете использовать $hostвместо$server_name
Йосси

не работает с server_name _; поэтому следует использовать переменную $ host, как предложено @Yossi.
Разван Григоре

1

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

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

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

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


Я думаю, это объясняет, почему $ server_protocol всегда возвращает HTTP
jwerre

Итак, вы ответили, почему это происходит ... какие-либо предложения о том, как это исправить?
2013 года
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.