Nginx location regex non funziona con il proxy pass


44

Sto cercando di far funzionare queste 2 direttive di localizzazione in Nginx, ma durante l'avvio di Nginx ricevo alcuni errori.

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

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

Questo è l'errore che sto ricevendo:

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

Sembra familiare a nessuno? Cosa mi sto perdendo qui?

Risposte:


49

Una piccola aggiunta alla grande risposta di Xaviar :

Se ti capita di non conoscere così bene nginx, c'è una differenza importante tra l'aggiunta della barra alla fine della proxy_passdirettiva.

Quanto segue non funziona:

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

ma questo fa:

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

La differenza è la /fine della proxy_passdirettiva.


1
Quel trailing ha /risolto il mio problema di configurazione, è stato difficile da catturare, grazie!
yorch

Mi stava facendo impazzire, grazie per averlo sottolineato!
Cyrrill,

22

Ti dice che l'URI nella direttiva pass proxy non può essere usato in una posizione regex. Questo perché nginx non può sostituire la parte dell'URI corrispondente alla regex nel locationblocco con quella passata nella proxy_passdirettiva in modo generico.

Immagina semplicemente che la tua posizione regex sia /foo/(.*)/bar, e specifichi proxy_pass http://server/test, nginx dovrebbe mappare la tua posizione regex a un'altra su un livello superiore perché non vuoi finire con /foo/test/bar/somethingma con /test/something. Quindi questo non è possibile in modo nativo.

Quindi, per questa parte, utilizzare quanto segue dovrebbe funzionare:

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;
    }

}

Tuttavia, non sarà possibile riscrivere i reindirizzamenti in modo che corrispondano al modello URI del blocco posizione perché riscrive l'URI corrente in fase di elaborazione, rendendo impossibile modificare l' Locationintestazione in base alla richiesta iniziale prima di riscrivere.


2
spostare il percorso in una regola di riscrittura ha funzionato per me. Grazie.
Sonjz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.