Nginx Reverse Proxy-Umleitung

13

Ich verwende nginxals Reverse-Proxy und wenn ich mich in meiner Weboberfläche anmelde, werde ich zur Proxy-URL weitergeleitet. Ich möchte es vermeiden und immer den "Servernamen" als URL behalten. Ist es möglich?

Das ist mein /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; 
    } 
} 

Ich verbinde mich http://my-app.net, gebe Anmeldeinformationen ein, werde dann http://ip_of_the_app:7180auf dieselbe Anmeldeseite weitergeleitet und muss mich erneut anmelden. Kann diese doppelte Anmeldung vermieden werden?

tonio94
quelle
tonio94, wurde Ihr Problem behoben? Wenn ja, akzeptieren Sie bitte die Antwort. Wenn nein, klären Sie bitte, was fehlt.
cnst
2
Ich habe es erst gestern getestet, es funktioniert, proxy_redirect muss entfernt werden. Danke für die Hilfe.
Tonio94

Antworten:

25

Nicht gesetzt proxy_redirectzu off, die nicht das tut , was Sie denken , es tut. proxy_redirectführt etwas Ähnliches wie das Umschreiben von URLs aus, zum Beispiel:

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

Auf diese Weise können Sie den /sales/Pfad an einer anderen Stelle hosten . Aber selbst dann proxy_redirecterledigen die Standardparameter genau das kostenlos für Sie. Standardmäßig wird der Speicherort in das umgeleitet, in dem sich der Speicherort befindet proxy_pass(und die Standardparameter werden verwendet, wenn Sie sie überhaupt nicht festlegen proxy_redirectoder verwenden proxy_redirect default;).

Sie müssen nicht einstellen proxy_redirect.


Was Sie vermissen, sind Header, die an die App gesendet werden müssen. Das wichtigste von ihnen ist HOST. Dadurch wird das Proxy wie gewünscht durchgeführt und die korrekte URL im Browser beibehalten.

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

Beachten Sie, dass die App at http://ip_of_the_app:7180/jetzt die Anfrage mit dem Host: my-app.netHeader empfängt .


Sie sollten auch ein paar weitere Header verwenden:

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

Dies ermöglicht eine bessere Protokollierung in der App unter http://ip_of_the_app:7180/. X-Forwarded-ForGeben Sie die IP des tatsächlichen Clients an (im Gegensatz zu nginxs IP) und X-Forwarded-Protoprüfen Sie, ob der Client nginxüber HTTP oder HTTPS mit dem verbunden ist.

gro♀
quelle
Danke für Ihre Hilfe. proxy_redirect wird nicht benötigt, aber proxy_set_header Referer ip_of_the_app: 7180 muss festgelegt sein, damit es ordnungsgemäß funktioniert.
Tonio94
@ tonio94 - Danke, ich habe die Antwort aktualisiert. Beachten Sie, dass die normale Verwendung von Referereinfach darin besteht $http_referer, sie aus der Anforderung zu kopieren. Dies funktioniert nicht, wenn die Anforderung keinen Referer-Header enthält. Daher ist die Hardcodierung in einigen Fällen eine Lösung.
gro♀
@ JonathanKomar - Danke dafür, du bist richtig, jetzt bearbeitet. Es tut mir leid, dass ich eine Weile gebraucht habe, um Ihren Kommentar zu bemerken.
gro♀