Odwrotne przekierowanie proxy Nginx

14

Używam nginxjako odwrotnego proxy i kiedy loguję się w interfejsie internetowym, jestem przekierowywany na adres URL proxy. Chciałbym tego uniknąć i zawsze utrzymywać „server_name” jako adres URL. Czy to możliwe?

To jest moje /etc/nginx/conf.d/my_app.conf:

server { 
    listen 443 ssl; 
    server_name my-app.net; 
    ssl_certificate /etc/pki/tls/certs/my-app.cer; 
    ssl_certificate_key /etc/pki/tls/private/my-app.key; 
    ssl_protocols TLSv1.1 TLSv1.2; 
    access_log /var/log/nginx/my-app.access.log main; 

    location / { 
        proxy_pass http://ip_of_the_app:7180/; 
        proxy_redirect off; 
    } 
} 

Łączę się http://my-app.net, wprowadzam dane logowania, a następnie jestem przekierowywany http://ip_of_the_app:7180na tę samą stronę logowania i muszę zalogować się ponownie. Czy można uniknąć podwójnego logowania?

tonio94
źródło
tonio94, czy twój problem został rozwiązany? jeśli tak, proszę przyjąć odpowiedź. jeśli nie, proszę wyjaśnić, czego brakuje.
cnst
2
Właśnie przetestowałem to wczoraj, działa, należy usunąć proxy_redirect. Dzięki za pomoc.
tonio94

Odpowiedzi:

27

Nie nastawiaj się proxy_redirectna to off, że nie robi to, co myślisz. proxy_redirectwykonuje coś podobnego do przepisywania adresów URL, na przykład:

location /sales/ { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_redirect http://ip_of_the_app:7180/ http://$host/sales/; 
}

Umożliwia to hostowanie /sales/ścieżki w innym miejscu. Ale nawet wtedy domyślne parametry dla proxy_redirectdokładnie to robią za darmo. Domyślnie przekierowuje lokalizację na wszystko, co jest w niej obecne proxy_pass(a domyślne parametry są używane, jeśli w ogóle nie ustawiono proxy_redirectlub nie użyto proxy_redirect default;).

Nie musisz ustawiać proxy_redirect.


Brakuje nagłówków, które należy wysłać do aplikacji. Najważniejszym z nich jest HOST. Spowoduje to wykonanie proxy zgodnie z potrzebami i zachowanie poprawnego adresu URL w przeglądarce.

location / { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_set_header HOST $host;
}

Pamiętaj, że aplikacja at http://ip_of_the_app:7180/otrzyma teraz żądanie z Host: my-app.netnagłówkiem.


Należy również rozważyć użycie kilku dodatkowych nagłówków:

proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

Pozwoli to na lepsze logowanie w aplikacji pod adresem http://ip_of_the_app:7180/. X-Forwarded-Forpodanie adresu IP rzeczywistego klienta (w przeciwieństwie do nginxadresu IP s) i X-Forwarded-Protosprawdzenie, czy klient nawiązał połączenie za nginxpośrednictwem protokołu HTTP lub HTTPS.

grochmal
źródło
Dzięki za pomoc. proxy_redirect nie jest potrzebne, ale proxy_set_header Referer ip_of_the_app: 7180 musi być ustawiony, aby działał poprawnie.
tonio94,
@ tonio94 - Dzięki, zaktualizowałem odpowiedź. Zauważ, że normalne użycie Refererto po prostu $http_refererkopiowanie go z żądania. To nie działa, jeśli żądanie nie ma nagłówka odwołania, dlatego też kodowanie na stałe jest rozwiązaniem w niektórych przypadkach.
grochmal
@JathanathanKomar - Dziękuję za to, masz rację, teraz edytowane. Przepraszam, że zauważyłem twój komentarz.
grochmal
@grochmal Dzięki, w zasadzie uratowałeś mi życie dzięki tym informacjom o: proxy_set_header HOST $ host;
Obay Abd-Algader