nginx URL rewrite klappt nicht

kamanu

Lt. Commander
Registriert
März 2012
Beiträge
1.675
Moin,

ich kämpfe grad ein wenig mit einem nginx als Reverse Proxy. Um verschiedene Dienste im Netzwerk anzubinden, macht er das im Moment nach dem Schema dienstA.domain.de schickt zu Dienst A, dienstB.domain.de schickt zu Dienst B.
Nun würde ich das ganze gerne so umbauen, dass sub.domain.de/dienstA zu Dienst A schickt und analog sub.domain.de/dienstB zu Dienst B.

Code:
server {
   listen 443 ssl http2;

   server_name sub.domain.de;

   include /etc/nginx/ssl/ssl.conf;

   client_max_body_size 10M;

   location /dienst1/ {
        rewrite ^/test/(.*) /$1 break;
        proxy_pass https://ipA:443;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }
   location /dienstB/ {
        rewrite ^/test/(.*) /$1 break;
        proxy_pass https://ipB:443;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}

Durch die Zeile mit dem
Code:
 rewrite ^/test/(.*) /$1 break;
hab ich es nun auch schon hinbekommen, dass er entsprechend die URL anpasst. Nun lädt allerdings was auf der Seite irgendwie an Ressourcen verlinkt ist entsprechend nicht mehr. Der Link führt dann zu https://sub.domain.de/ressource.css statt zu https://sub.domain.de/dienstA/ressource.css.
Ist mein Vorhaben überhaupt möglich, ohne den Webserver von DienstA bzw. DienstB anzufassen?

Beste Grüße

kamanu
 
Dafür brauchst du kein rewrite und das macht in der Config oben auch keinen Sinn. Dein regex sucht nach "/test/" am Anfang der angefragten URL, aber der Location-Block hört auf "/dienstA/" bzw. "/dienstB/"... das passt also nie und wird demnach nie umgeschrieben.

Schmeiß das rewrite raus und häng an den "proxy_pass" hinten noch einen "/" dran, also "https://ipa:443/". Mit dem "/" hinten im proxy_pass schneidet nginx den Teil der URL raus, der im Location-Block angegeben ist. Der Rest wird 1:1 weitergegeben. Aus "/dienstA/blub" wird dann beim Zielsystem hinter dem proxy_pass "/blub".

Unter Umständen holst du dir so aber andere PRobleme rein. Deine Dienste A und B müssen wissen, dass sie hinter einem Teilpfad erreichbar sind, nämlich "/dienstA" bzw. "/dienstB" und müssen Links, die sie selbst erzeugen, entsprechend ergänzen.
 
@KillerCow, ja das mit dem Test war ein Copy&Paste Fehler meinerseits hier ins Forum.
Das Problem ist, das Dienst A und B nichts von ihrem Glück wissen. Daher funktioniert das ohne rewrite aber mit deinem / zwar jetzt auch, aber das Problem mit den Ressourcen die da liegen bleibt trotzdem.
 
Zuletzt bearbeitet:
kamanu schrieb:
Um verschiedene Dienste im Netzwerk anzubinden, macht er das im Moment nach dem Schema dienstA.domain.de schickt zu Dienst A, dienstB.domain.de schickt zu Dienst B.
Nun würde ich das ganze gerne so umbauen, dass sub.domain.de/dienstA zu Dienst A schickt und analog sub.domain.de/dienstB zu Dienst B.
Warum eigentlich? Finde erste Variante wesentlich sinnvoller, vor allem weil man das schön über den DNS-Namensraum/Vhost getrennt hat. Man sieht ja jetzt, welche Probleme man bekommt, wenn das alles über denselben FQDN laufen soll.
Ergänzung ()

Edit:
kamanu schrieb:
rewrite ^/test/(.*) /$1 break;
Meine regex-Fähigkeiten sind jetzt nicht gut, aber sollte das dann nicht so aussehen, wenn du 'diensta' in die URL einfügen willst? Oder wozu soll die rewrite-rule dienen?
Code:
rewrite ^/(.*)$ /diensta/$1 break;
 
Zuletzt bearbeitet:
qiller schrieb:
Warum eigentlich? Finde erste Variante wesentlich sinnvoller, vor allem weil man das schön über den DNS-Namensraum/Vhost getrennt hat. Man sieht ja jetzt, welche Probleme man bekommt, wenn das alles über denselben FQDN laufen soll.
Ja und nein. Im Grund genommen sind das diverse Subdienste die zu ein und demselben Dienst gehören.
Das ganze soll aber nach außen hin via Entra ID AppProxy verfügbar gemacht werden. Dabei müsste ich aber für jede Subdomain nen eigene App anlegen mit eigenem Zertifikat etc. Da Microsoft aber noch nicht erlaubt via Graph das Zertifikat zu tauschen, ist das ne immense Klickarbeit wenn man das für 10 Dienste machen muss. Also im Grunde genommen ist es ein Luxusproblem ;)

qiller schrieb:
Meine regex-Fähigkeiten sind jetzt nicht gut, aber sollte das dann nicht so aussehen, wenn du 'diensta' in die URL einfügen willst? Oder wozu soll die rewrite-rule dienen?
Sollte es. Das hatte ja @KillerCow auch schon erkannt. Da hatte ich falsch hier rüber copy & pasted.
 
kamanu schrieb:
das Dienst A und B nichts von ihrem Glück wissen
Jupp, dann wirst du immer Probleme damit haben. Man kann noch an anderen Stellen im nginx URLs umschreiben, auch in den Antworten des Upstream, aber sauber wird das nie. Die Dienste müssen an der Stelle dafür gebaut sein, hinter einem Reverseproxy zu stehen. Alles andere ist leider nicht zeitgemäß.

Je nachdem, was da für http-Frameworks benutzt werden, ist das in der Regel aber konfigurierbar. Teilweise reagieren die auch schon auf passend gesetzte HTTP-Header von ganz alleine. Sowas wie "X-Forwarded-Prefix" oder so.
 
  • Gefällt mir
Reaktionen: kamanu
Zurück
Oben