przepisz http do https z ngnix za modułem równoważenia obciążenia

13

Używam modułu równoważenia obciążenia Rackspace, który pozwala mi skonfigurować mój klucz ssl / pem w panelu administracyjnym. Wszystko działa dobrze, mogę używać zarówno protokołów http, jak i https. Ale jeśli spróbuję przekierować http na https przy użyciu:

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

... dostaję pętlę przekierowania. Zdaję sobie sprawę, że nie słucham portu 443, ale to dlatego, że moduł równoważenia obciążenia poradził sobie z tym. Próbowałem też owijać przepisywanie if ($scheme ~* http){bezskutecznie.

Inną częścią mojego pytania jest to, że chcę usunąć www z adresu URL, czy mogę to zrobić za pomocą jednego przepisania? Czy powyższe przepisanie również nie powinno się tym zająć?

Dzięki za pomoc!

Jwerre
źródło
Moduł równoważenia obciążenia powinien wysyłać pewne informacje o tym, czy połączenie było HTTPS. Zapytaj Rackspace. (Aha, i pewnie nie chce się pozbyć www ...)
Michael Hampton
Interesujące, przyjrzę się temu. Jak myślisz, dlaczego nie powinienem pozbyć się www?
jwerre

Odpowiedzi:

14

sciurus ma rację, ponieważ usługi równoważenia obciążenia w chmurze Rackspace ustawiają X-Forwarded-Proto na https, gdy SSL jest odciążany w module równoważenia obciążenia. Aby uniknąć pętli przekierowań w nginx, powinieneś być w stanie dodać do locationsekcji w konfiguracji vhost:

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

Powinno to uniknąć nieskończonej pętli przekierowania podczas przekierowywania żądań innych niż https na https.

slade
źródło
18

Przy użyciu nginx wbudowanego w zmiennych serwerowych $request_urii $server_namemożna to zrobić bez użycia wyrażeń regularnych w ogóle. Dodaj następujące elementy do locationbloku serwera i gotowe:

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

Zakłada się, że moduł równoważenia obciążenia wysyła $http_x_forwarded_protonagłówek wraz z żądaniem do instancji zaplecza. Inne typowe nagłówki obejmują, $http_x_forwarded_schemea także just $scheme.

Więcej informacji można znaleźć w dokumentacji pułapek i typowych błędów nginx : https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites

Luke Peterson
źródło
5
Zdecydowanie powinieneś użyć return over przepisać. Pozytywne.
designermonkey
1
Możesz użyć $hostzamiast$server_name
Yossi
nie działa z nazwa_serwera _; więc należy użyć zmiennej $ host zgodnie z sugestią @Yossi.
Razvan Grigore,
1

Moduł równoważenia obciążenia zawsze mówi do ciebie przez http. Co się dzieje?

  1. Przeglądarka wysyła żądanie do portu 80 modułu równoważenia obciążenia
  2. Moduł równoważenia obciążenia wysyła żądanie do portu 80 na serwerze WWW
  3. Twój serwer internetowy wysyła przekierowanie do użytkownika
  4. Użytkownik wysyła żądanie do portu 443 w module równoważenia obciążenia

Kroki 2-4 powtarzają się, dopóki przeglądarka nie wykryje pętli przekierowań i nie poddaje się.

EDYCJA: Aby rozwiązać ten problem, przepisz tylko, gdy nagłówek X-Forwarded-Proto jest ustawiony na http. Ten nagłówek jest sposobem, w jaki moduł równoważenia obciążenia Rackspace informuje serwer WWW o protokole, za pośrednictwem którego otrzymał żądanie.

Sciurus
źródło
Wydaje mi się, że to wyjaśnia, dlaczego $ server_protocol zawsze zwraca HTTP
jwerre
Więc odpowiedziałeś, dlaczego tak się dzieje ... jakieś sugestie, jak to naprawić?
jwerre