Ich habe ein paar API-Endpunkte, die ich unter einem einzigen Standort /api
mit Unterpfaden zu verschiedenen Endpunkten bereitstellen möchte. Insbesondere möchte ich, dass webdis unter /api
und eine proprietäre API unter verfügbar sind /api/mypath
.
Ich mache mir keine Sorgen über Konflikte mit der webdis-API, da ich Unterpfade verwende, bei denen es unwahrscheinlich ist, dass sie mit den Namen von Redis-Befehlen in Konflikt geraten. Außerdem habe ich die volle Kontrolle über das Design der API, um Konflikte zu vermeiden.
Hier ist die Konfigurationsdatei von meinem Testserver, auf den ich gehackt habe:
server {
listen 80;
server_name localhost;
server_name 192.168.3.90;
server_name 127.0.0.1;
location / {
root /home/me/src/phoenix/ui;
index index.html;
}
# temporary hardcoded workaround
location = /api/mypath/about {
proxy_pass http://localhost:3936/v1/about;
}
location /api {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://localhost:7379/;
}
# tried this but it gives "not found" error
#location ^~ /api/mypath/ {
# rewrite ^/api/mypath/(.*)$ /$1 break;
# proxy_pass http://localhost:3936/v1/;
#}
#
#location ^~ /api {
# rewrite ^/api/(.*)$ /$1 break;
# proxy_pass http://localhost:7379/;
#}
}
Wie kann ich meine Problemumgehung so ändern, dass alle Anforderungen an /api/mypath/*
den Endpunkt an Port 3936 und alle anderen an Port 7379 gesendet werden?
quelle
tried this to no avail
? Was ist passiert, als Sie diese Standortanweisung aktiviert haben? Verbindungszeitüberschreitung? Standort stimmt nicht überein?Antworten:
Sie müssen dafür nicht umschreiben.
Laut der Nginx-Dokumentation
Daher wird jede Anfrage, die mit beginnt
/api/mypath/
, immer vom zweiten Block bedient, da dies die am längsten übereinstimmende Präfixposition ist.Jede Anforderung, die mit
/api/
nicht unmittelbar gefolgt von beginnt,mypath/
wird immer vom ersten Block bedient, da der zweite Block nicht übereinstimmt, wodurch der erste Block zum am längsten übereinstimmenden Präfixstandort wird.quelle
=
,~*
,~
und^~
) es scheinen mag kontraintuitiv , dass^~
schließt reguläres Ausdrücken (da~
gibt einen regulären Ausdruck) ... aber wenn Sie sich erinnern,^
in einer Regex Zeichenklasse (zB[^a-z]
) negiert , dass Klasse (so dass das Beispiel bedeutet (jedes Zeichen außer denen von az); in ähnlicher Weise^~
negiert alle potenziellen regulären Ausdruckslokalisierungsblöcke.OK, ich dachte, der Fehler "nicht gefunden" kommt von nginx, aber eigentlich von meiner API. Dies ist meine Lösung, wenn jemand interessiert ist:
quelle