it-swarm.com.de

Nginx Location Regex funktioniert nicht mit Proxy Pass

Ich versuche, diese beiden Standortanweisungen in Nginx zum Laufen zu bringen, aber beim Booten von Nginx treten einige Fehler zurück.

   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?

44
Niels

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 des proxy_pass Direktive.

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 ist das / am Ende von proxy_pass Direktive.

51
mark

Es sagt Ihnen, dass der URI in der Proxy-Pass-Direktive nicht an einem Regex-Speicherort verwendet werden kann. Dies liegt daran, dass nginx den Teil des URI, der mit dem regulären Ausdruck im Block location übereinstimmt, nicht generisch durch den Teil ersetzen kann, der in der Direktive proxy_pass übergeben wurde.

Stellen Sie sich einfach vor, Ihr Standort-Regex ist /foo/(.*)/bar, und Sie geben proxy_pass http://server/test an. Nginx müsste Ihren Standort-Regex einem anderen auf einer höheren Ebene zuordnen, da Sie nicht mit /foo/test/bar/something, sondern mit /test/something enden möchten. 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, Umleitungen so umzuschreiben, dass sie mit dem URI-Muster des Standortblocks übereinstimmen, da der aktuell verarbeitete URI neu geschrieben wird, sodass der Header Location nicht basierend auf der anfänglichen Anforderung geändert werden kann vor dem Umschreiben.

24
Xavier Lucas