Nginx Reverse-Proxy nur bestimmte Unterverzeichnisse und leitet alles andere durch

Nginx Reverse-Proxy nur bestimmte Unterverzeichnisse und leitet alles andere durch

Ich habe eine Entwicklungssituation, in der ich eine Domäne mit mehreren Diensten habe:

https://somewebpage.com

Auf diesem Dienst gibt es mehrere Projekte als Unterverzeichnisse

  • https://somewebpage.com<- Zielseite
  • https://somewebpage.com/api<- Rest-API-Server
  • https://somewebpage.com/app<- meine App

Ist es also möglich (und wie), Nginx und die Hosts-Datei so einzurichten, dass der Reverse-Proxy nur https://somewebpage.com/appfür meinen lokalen Build verwendet wird http://localhost:3000?

Das Problem besteht darin, dass beim Bereitstellen der App kein Problem mit dem Zugriff auf /apiden Rest-Server besteht, bei der lokalen Bereitstellung jedoch mein Nginx-Reverse-Proxy auch Intercepts landing pageund URLs abfängt.rest api server

Meine Nginx-Konfiguration sieht folgendermaßen aus:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;
    
    index index.html;

    proxy_max_temp_file_size 0;
    proxy_buffering off;

    server {
        listen 80;
        server_name somewebpage.com;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name somewebpage.com;

        ssl_certificate /etc/ssl/certs/certificate.crt;
        ssl_certificate_key /etc/ssl/certs/ccertificate.key;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

        location /app {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass http://localhost:3000;
        }
    }
}

Und in meinem /etc/hostshabe ich:

127.0.0.1    somewebpage.com

Gibt es noch andere Tricks, um ähnliche Ergebnisse zu erzielen?

Der Grund, warum ich dies versuche, ist, dass, wenn ich es von meinem aus mache, localhost:3000es mit Fehlern antwortet CORSund meine Anrufe an ablehnt /api.

Oder stellt dies ein zu großes Sicherheitsrisiko dar und ich muss nach einer anderen Zugriffsmöglichkeit fragen /api?

Vielen Dank für Ihre Antworten im Voraus.

Antwort1

Sie müssen Folgendes hinzufügen:

location / {
    try_files $uri $uri/ =404;
}

Dies teilt nginx mit, wie Anfragen behandelt werden, die nicht mit den anderen angegebenen übereinstimmen location. Weitere Informationen dazu, wie nginx locationden zu verwendenden Block auswählt, finden Sie unterNginx-Dokumentation.

Antwort2

Ich habe eine Lösung gefunden, die für mich funktioniert.

somewebpage.comverweist auf xx.xx.xx.xxeine statische IP-Adresse, also habe ich einfach eine weitere Proxy-Weiterleitung zu dieser IP-Adresse anstelle der URL hinzugefügt, ähnlich wie in der Antwort von Tero Kilkanen.

  location / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_pass https://xx.xx.xx.xx;
  }

Auf diese Weise /etc/hostswird meine somewebpage.comAnfrage nicht abgefangen, da die Anfrage die Domänenauflösung umgeht.

Am Ende landete ich bei der folgenden Nginx-Konfiguration, die für mich funktionierte:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;
    
    index index.html;

    proxy_max_temp_file_size 0;
    proxy_buffering off;

    server {
        listen 80;
        server_name somewebpage.com;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name somewebpage.com;

        ssl_certificate /etc/ssl/certs/certificate.crt;
        ssl_certificate_key /etc/ssl/certs/ccertificate.key;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

        location /app {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass http://localhost:3000;
        }

        location / {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass https://xx.xx.xx.xx;
        }
    }
}

Diese Lösung funktioniert möglicherweise nicht für jeden, da im Hintergrund mehrere IP-Adressen oder dynamische IP-Adressen vorhanden sind oder etwas anderes. Aber bei mir hat es funktioniert und für Entwicklungszwecke war es gut genug.

verwandte Informationen