Wie leitet man Query-String-Parameter durch Nginx Proxy_Pass weiter?

Veröffentlicht 13. Oktober 2024

Problem: Weiterleitung von Query-String-Parametern in Nginx

Bei der Verwendung von Nginx als Reverse-Proxy kann es schwierig sein, Query-String-Parameter von der ursprünglichen Anfrage an den Backend-Server weiterzuleiten. Dieses Problem tritt oft bei der Einrichtung der proxy_pass-Direktive auf, da das Standardverhalten diese Parameter nicht immer beibehält.

Implementierung der Query-String-Weiterleitung in Nginx Proxy_Pass

Methode 1: Verwendung eines einfachen Location-Blocks

Der Location-Block-Ansatz bietet eine Möglichkeit, Query-String-Parameter in Nginx weiterzuleiten. Diese Methode verwendet eine location-Direktive mit einem Schrägstrich am Ende der proxy_pass-Anweisung.

Konfigurationsschritte:

  1. Öffnen Sie Ihre Nginx-Konfigurationsdatei.
  2. Fügen Sie den Location-Block hinzu oder ändern Sie ihn:
location /service/ {
    proxy_pass http://apache/;
}
  1. Der abschließende Schrägstrich in proxy_pass http://apache/; weist Nginx an, /service/ durch / zu ersetzen, wenn die Anfrage weitergeleitet wird.
  2. Diese Konfiguration leitet Query-String-Parameter ohne zusätzliche Änderungen weiter.

Tipp: Testen der Query-String-Weiterleitung

Um zu überprüfen, ob die Query-String-Weiterleitung korrekt funktioniert, können Sie ein Tool wie curl oder die Entwicklertools Ihres Browsers verwenden. Versuchen Sie, eine URL mit Query-Parametern aufzurufen, z.B.: http://ihre-domain.de/service/seite?param1=wert1&param2=wert2. Prüfen Sie, ob diese Parameter korrekt an Ihren Backend-Server weitergeleitet werden.

Methode 2: Verwendung regulärer Ausdrücke mit Query-Parametern

Für komplexere Szenarien bietet die Verwendung regulärer Ausdrücke mit Query-Parametern mehr Flexibilität.

Konfigurationsschritte:

  1. Öffnen Sie Ihre Nginx-Konfigurationsdatei.
  2. Fügen Sie den Location-Block mit einem regulären Ausdruck hinzu oder ändern Sie ihn:
location ~* ^/service/(.*) {
    proxy_pass http://apache/$1$is_args$args;
}
  1. Das ~* zeigt einen Regex-Match ohne Berücksichtigung der Groß-/Kleinschreibung an.
  2. ^/service/(.*) erfasst alles nach /service/ in der URL.
  3. $1 in proxy_pass bezieht sich auf die erfasste Gruppe.
  4. $is_args$args fügt den Query-String zur weitergeleiteten URL hinzu.

Diese Methode ermöglicht eine bessere Kontrolle über URL-Umschreibungen bei gleichzeitiger Beibehaltung der Query-String-Parameter.

Weitere Überlegungen zur Nginx Proxy_Pass-Einrichtung

Erhaltung der ursprünglichen Anfrageinformationen

Bei der Verwendung von proxy_pass ist es wichtig, die ursprüngliche Anfrage intakt zu halten. Hier sind einige Möglichkeiten, dies zu tun:

  1. Verwendung von proxy_set_header-Direktiven:

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    Diese Header senden die Informationen des ursprünglichen Clients an den Backend-Server.

  2. Aktivieren von proxy_buffering:

    proxy_buffering on;

    Dies ermöglicht Nginx, Antworten vom Backend-Server zu puffern und verbessert die Leistung.

  3. Festlegen von Timeouts:

    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;

    Diese Einstellungen regeln die Verbindungszeiten zwischen Nginx und dem Backend-Server.

Tipp: URL-Pfad beibehalten

Um den ursprünglichen URL-Pfad bei der Weiterleitung von Anfragen beizubehalten, verwenden Sie die $request_uri-Variable:

location /api/ {
    proxy_pass http://backend$request_uri;
}

Dies stellt sicher, dass der vollständige Pfad nach /api/ an den Backend-Server gesendet wird.

Umgang mit SSL/TLS in Proxy-Konfigurationen

Für sichere proxy_pass-Setups sollten Sie diese Praktiken in Betracht ziehen:

  1. Verwendung von SSL/TLS für Backend-Verbindungen:

    server {
    listen 443 ssl;
    server_name example.com;
    
    ssl_certificate /pfad/zum/zertifikat.pem;
    ssl_certificate_key /pfad/zum/schluessel.pem;
    
    location / {
        proxy_pass https://backend;
        proxy_ssl_verify on;
        proxy_ssl_trusted_certificate /pfad/zum/vertrauenswuerdigen_ca_zertifikat.pem;
    }
    }

    Diese Konfiguration verwendet HTTPS für die proxy_pass-Verbindung und überprüft das Zertifikat des Backend-Servers.

  2. Festlegen von SSL-Protokollen und Chiffren:

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    Diese Einstellungen beschränken die SSL/TLS-Protokolle und Chiffren auf sichere Optionen.

  3. Aktivieren von HSTS (HTTP Strict Transport Security):

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    Dieser Header weist Browser an, für Ihre Domain immer HTTPS zu verwenden.