переписати 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?
jwerre

Відповіді:


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 та загальні помилки : https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites


5
Однозначно слід використовувати return over rewrite. Отримано.
дизайнер

1
Ви можете використовувати $hostзамість$server_name
Yossi

не працює з ім'ям_сервера _; тому слід використовувати змінну $ host, як запропонував @Yossi.
Разван Григоре

1

Балансир навантаження завжди спілкується з вами через http. Що відбувається

  1. Браузер робить запит на порт 80 на балансирі навантаження
  2. Балансир завантаження робить запит на порт 80 на веб-сервері
  3. Ваш веб-сервер надсилає перенаправлення користувачеві
  4. Користувач робить запит на порт 443 на балансирі навантаження

Кроки 2-4 продовжуйте повторюватися, поки браузер не виявить цикл переадресації і не відмовиться.

EDIT: Щоб вирішити це питання, виконайте перезапис лише тоді, коли для заголовка X-Forwarded-Proto встановлено значення http. Цей заголовок - це те, як балансир завантаження Rackspace повідомляє вашому веб-серверу протокол, через який він отримав запит.


Я думаю, це пояснило б, чому $ server_protocol завжди повертає HTTP
jwerre

Отже, ви відповіли, чому це відбувається ... якісь пропозиції щодо виправлення?
jwerre
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.