
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
<- Zielseitehttps://somewebpage.com/api
<- Rest-API-Serverhttps://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/app
für meinen lokalen Build verwendet wird http://localhost:3000
?
Das Problem besteht darin, dass beim Bereitstellen der App kein Problem mit dem Zugriff auf /api
den Rest-Server besteht, bei der lokalen Bereitstellung jedoch mein Nginx-Reverse-Proxy auch Intercepts landing page
und 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/hosts
habe 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:3000
es mit Fehlern antwortet CORS
und 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 location
den zu verwendenden Block auswählt, finden Sie unterNginx-Dokumentation.
Antwort2
Ich habe eine Lösung gefunden, die für mich funktioniert.
somewebpage.com
verweist auf xx.xx.xx.xx
eine 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/hosts
wird meine somewebpage.com
Anfrage 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.