Obecnie mam ELB obsługujący zarówno http://www.example.org, jak i https://www.example.org .
Chciałbym to skonfigurować, aby każde żądanie wskazujące na http://www.example.org było przekierowywane na https://www.example.org .
ELB wysyła żądania https jako żądania HTTP, więc używając:
server {
listen 80;
server_name www.example.org;
rewrite ^ https://$server_name$request_uri? permanent;
}
nie będzie działać, ponieważ żądania wysłane do https://www.example.org będą nadal wysyłane do portu 80 na nginx.
Wiem, że można to przepisać jako
server {
listen 80;
server_name www.example.org;
if ($http_x_forwarded_proto != "https") {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
}
Ale wszystko, co przeczytałem, mówi, że if
należy unikać za wszelką cenę w konfiguracji nginx, i tak byłoby w przypadku każdego pojedynczego żądania. Oznacza to również, że muszę skonfigurować specjalną oddzielną konfigurację dla kontroli poprawności ( jak opisano tutaj : „… gdy jesteś za ELB, gdzie ELB działa jako punkt końcowy HTTPS i wysyła tylko ruch HTTP do twojego serwera, przerwać zdolność do odpowiedzi za pomocą odpowiedzi HTTP 200 OK w celu sprawdzenia poprawności, którego potrzebuje ELB ”).
Zastanawiam się nad umieszczeniem loginu w kodzie aplikacji sieciowej zamiast konfiguracji nginx (i na potrzeby tego pytania załóżmy, że jest to aplikacja oparta na Django), ale nie jestem pewien, czy byłoby to większe obciążenie ogólne niż if
konfiguracja w.