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

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

jwerre
источник
Балансировщик нагрузки должен посылать вам некоторое указание того, было ли соединение 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 сообщает вашему веб-серверу протокол, по которому он получил запрос.

Sciurus
источник
Я думаю, это объясняет, почему $ server_protocol всегда возвращает HTTP
jwerre
Итак, вы ответили, почему это происходит ... какие-либо предложения о том, как это исправить?
2013 года