A regex de localização do Nginx não funciona com o proxy pass

34

Estou tentando fazer com que essas duas diretivas de localização funcionem no Nginx, mas estou recuperando alguns erros ao inicializar o Nginx.

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

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

Este é o erro que estou recebendo:

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

Parece familiar para alguém? O que eu estou sentindo falta aqui?

    
por Niels 04.12.2014 / 14:44

2 respostas

34

Uma pequena adição à ótima resposta de Xaviar :

Se você não está tão familiarizado com o nginx, há uma diferença importante entre adicionar a barra ao final da diretiva proxy_pass .

O seguinte não funciona:

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

mas este faz:

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

A diferença é o / no final da diretiva proxy_pass .

    
por 13.04.2017 / 14:14
17

Ele informa que o URI na diretiva de proxy pass não pode ser usado em um local regex. Isso ocorre porque o nginx não pode substituir a parte do URI que corresponde à regex no bloco location pelo que foi transmitido pela diretiva proxy_pass de maneira genérica.

Basta imaginar que sua regex de localização é /foo/(.*)/bar e você especifica proxy_pass http://server/test , nginx teria que mapear sua localização regex para outra em um nível superior porque você não quer terminar com /foo/test/bar/something , mas com% código%. Então isso não é possível nativamente.

Portanto, para esta parte, utilizar o seguinte deve funcionar:

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

}

No entanto, não será possível reescrever redirecionamentos para que correspondam ao padrão de URI do bloco de localização, porque ele reescreve o URI atual processado, impossibilitando a alteração do cabeçalho /test/something com base na solicitação inicial antes de reescrever.

    
por 04.12.2014 / 16:47