Frage Nginx-Standort Regex funktioniert nicht mit Proxy-Pass


Ich versuche, diese 2 Standort-Direktiven in Nginx arbeiten zu lassen, aber ich bekomme einige Fehler zurück, wenn ich Nginx starte.

   location ~ ^/smx/(test|production) {
        proxy_pass   http://localhost:8181/cxf;
    }

    location ~ ^/es/(test|production) {
        proxy_pass   http://localhost:9200/;
    }

Dies ist der Fehler, den ich erhalte:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block

Kommt es jemandem bekannt vor? Was fehlt mir hier?


33
2017-12-04 13:44


Ursprung




Antworten:


Eine kleine Ergänzung zu der tollen Antwort von Xaviar:

Wenn Sie mit nginx nicht so gut vertraut sind, gibt es einen wichtigen Unterschied zwischen dem Hinzufügen des Schrägstrichs zum Ende des proxy_pass Richtlinie.

Folgende nicht Arbeit:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend/;

aber dieses tut:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend;

Der Unterschied ist der / am Ende von proxy_pass Richtlinie.


34
2017-12-04 15:47



Das hinterher / behebt mein Konfigurationsproblem, es war schwer zu fangen, danke! - yorch
Hat mich verrückt gemacht, danke, dass du darauf hingewiesen hast! - cyrrill


Das sagt dir das der URI in der Proxy-Pass-Direktive kann nicht in einem Regex-Speicherort verwendet werden. Dies liegt daran, dass nginx den Teil des URI, der mit dem Regex übereinstimmt, nicht ersetzen kann location Block mit dem in der proxy_pass Richtlinie eine generische Art und Weise.

Stellen Sie sich einfach vor, Ihr Standort Regex ist /foo/(.*)/bar, und Sie spezifizieren proxy_pass http://server/test, nginx müsste Ihren Standort-Regex einem anderen auf einer höheren Ebene zuordnen, weil Sie nicht damit aufhören wollen /foo/test/bar/something aber mit /test/something. Das ist also nativ nicht möglich.

Für diesen Teil sollte folgendes funktionieren:

server {

   [ ... ]

    location ~ ^/smx/(test|production) {
        rewrite ^/smx/(?:test|production)/(.*)$ /cxf/$1 break;
        proxy_pass http://localhost:8181;
    }

    location ~ ^/es/(test|production) {
        rewrite ^/es/(?:test|production)/(.*)$ /$1 break;
        proxy_pass http://localhost:9200;
    }

}

Es ist jedoch nicht möglich, Weiterleitungen so umzuschreiben, dass sie dem Standortblock-URI-Muster entsprechen, da der aktuelle URI, der gerade verarbeitet wird, überschrieben wird Location Kopfzeile basierend auf der erste Anfrage vor dem Neuschreiben.


17



Den Pfad in eine Rewrite-Regel zu verschieben, funktionierte für mich. Vielen Dank. - sonjz