it-swarm.com.de

Wie schreibe ich URLs in einer Proxy-Antwort in NGINX?

Ich bin es gewohnt, Apache mit mod_proxy_html zu verwenden und versuche mit NGINX etwas Ähnliches zu erreichen. Der spezielle Anwendungsfall ist, dass auf Tomcat eine Administrator-Benutzeroberfläche auf Port 8080 auf einem Server im Stammkontext ausgeführt wird:

http://localhost:8080/

Ich muss dies an Port 80 anzeigen, aber ich habe andere Kontexte auf dem NGINX-Server, der auf diesem Host ausgeführt wird. Versuchen Sie daher, auf Folgendes zuzugreifen:

http://localhost:80/admin/

Ich hatte gehofft, dass der folgende super einfache Serverblock dies tun würde, aber es ist nicht ganz so:

server {
    listen  80;
    server_name screenly.local.akana.com;

    location /admin/ {
        proxy_pass http://localhost:8080/;
    }
}

Das Problem ist, dass der zurückgegebene Inhalt (html) URLs zu Skripts und Stilinformationen enthält, auf die alle vom Stammkontext aus zugegriffen wird. Daher muss ich diese URLs mit/admin/anstatt mit/überschreiben.

Wie mache ich das in NGINX?

53
IanG

Wir sollten zuerst die Dokumentation zu Proxy_Pass sorgfältig und vollständig lesen.

Die an den Upstream-Server übergebene URI wird basierend darauf bestimmt, ob die Anweisung "proxy_pass" mit der URI verwendet wird oder nicht. Ein nachstehender Schrägstrich in der Direktive proxy_pass bedeutet, dass der URI vorhanden ist und / entspricht. Das Fehlen eines nachlaufenden Schrägstrichs bedeutet, dass die URI nicht vorhanden ist.

Proxy_pass mit URI:

location /some_dir/ {
    proxy_pass http://some_server/;
}

Mit dem oben genannten gibt es den folgenden Proxy:

http:// your_server/some_dir/ some_subdir/some_file ->
http:// some_server/          some_subdir/some_file

Grundsätzlich wird /some_dir/ durch / ersetzt, um den Anforderungspfad von /some_dir/some_subdir/some_file in /some_subdir/some_file zu ändern.

Proxy_pass ohne URI:

location /some_dir/ {
    proxy_pass http://some_server;
}

Mit dem zweiten (kein nachstehender Schrägstrich): Der Proxy geht so:

http:// your_server /some_dir/some_subdir/some_file ->
http:// some_server /some_dir/some_subdir/some_file

Grundsätzlich wird der vollständige ursprüngliche Anforderungspfad ohne Änderungen weitergeleitet.


In Ihrem Fall scheint es also so, als würden Sie den abschließenden Schrägstrich einfach fallen lassen, um zu bekommen, was Sie wollen.


Vorbehalt

Beachten Sie, dass das automatische Überschreiben nur funktioniert, wenn Sie in proxy_pass keine Variablen verwenden. Wenn Sie Variablen verwenden, sollten Sie sich selbst umschreiben:

location /some_dir/ {
  rewrite    /some_dir/(.*) /$1 break;
  proxy_pass $upstream_server;
}

Es gibt andere Fälle, in denen das Umschreiben nicht funktioniert. Aus diesem Grund ist das Lesen von Dokumentation ein Muss.


Bearbeiten

Wenn Sie Ihre Frage noch einmal lesen, scheint es mir entgangen zu sein, dass Sie nur die HTML-Ausgabe bearbeiten möchten.

Dafür können Sie die Direktive sub_filter verwenden. So etwas wie ...

location /admin/ {
    proxy_pass http://localhost:8080/;
    sub_filter "http://your_server/" "http://your_server/admin/";
    sub_filter_once off;
}

Grundsätzlich die zu ersetzende Zeichenfolge und die Ersatzzeichenfolge

79
Dayo

Möglicherweise müssen Sie auch die folgende Anweisung vor dem ersten "sub_filter" für Backend-Server mit Datenkomprimierung festlegen:

proxy_set_header Accept-Encoding "";

Andernfalls kann es nicht funktionieren .. Für Ihr Beispiel wird es so aussehen:

location /admin/ {
    proxy_pass http://localhost:8080/;
    proxy_set_header Accept-Encoding "";
    sub_filter "http://your_server/" "http://your_server/admin/";
    sub_filter_once off;
}
11
Vladimir Sh.

Sie können das folgende Nginx-Konfigurationsbeispiel verwenden:

upstream adminhost {
  server adminhostname:8080;
}

server {
  listen 80;

  location ~ ^/admin/(.*)$ {
  proxy_pass http://adminhost/$1$is_args$args;
  proxy_redirect off;
  proxy_set_header Host $Host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Host $server_name;
}
0
Alex Elkin