Nginx Location Regex funktioniert nicht mit Proxy Pass

43

Ich versuche, diese beiden Standortrichtlinien in Nginx zum Laufen zu bringen, aber beim Booten von Nginx werden einige Fehler zurückgegeben.

   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 ich vermisse ich hier?

Niels
quelle

Antworten:

48

Eine kleine Ergänzung zur großen Antwort von Xaviar :

Wenn Sie mit Nginx nicht so gut vertraut sind, gibt es einen wichtigen Unterschied zwischen dem Hinzufügen des Schrägstrichs am Ende der proxy_passDirektive.

Folgendes funktioniert nicht :

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

aber dieser tut:

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

Der Unterschied liegt /am Ende der proxy_passRichtlinie.

Marke
quelle
1
Dieses Trailing hat /mein Konfigurationsproblem behoben, es war schwer zu fassen, danke!
8.
Hat mich verrückt gemacht, danke, dass du darauf hingewiesen hast!
Cyrrill
21

Sie erfahren, dass der URI in der Proxy-Pass-Direktive nicht in einem regulären Ausdruck verwendet werden kann. Dies liegt daran, dass nginx den Teil des URI, der mit dem regulären Ausdruck im locationBlock übereinstimmt, nicht durch den in der proxy_passDirektive generisch übergebenen ersetzen kann .

Stellen Sie sich einfach vor, Ihr Standort-regulärer Ausdruck ist /foo/(.*)/barund Sie geben an proxy_pass http://server/test, dass nginx Ihren Standort-regulären Ausdruck einem anderen auf einer höheren Ebene zuordnen müsste, weil Sie nicht mit, /foo/test/bar/somethingsondern mit enden möchten /test/something. Das ist also nativ nicht möglich.

Für diesen Teil sollte also 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, Redirects neu zu schreiben, um sie mit dem URI-Muster des Standortblocks abzugleichen, da der aktuell verarbeitete URI neu geschrieben wird. Dies macht es unmöglich, den LocationHeader basierend auf der ursprünglichen Anforderung vor dem erneuten Schreiben zu ändern .

Xavier Lucas
quelle
2
Das Verschieben des Pfads in eine Umschreiberegel hat bei mir funktioniert. Vielen Dank.
sonjz