Nginx reescreve para remover o primeiro nó do caminho (genérico)

3

Atualmente, estou escrevendo um distribuidor que enviará URLs diferentes para URLs de serviço específicos.

Eu essencialmente quero enviar algo como:

POST http://nginx/awesome_service/a/lot/of/params/and?so=on

para

POST http://awesome_service/a/lot/of/params/and?so=on

Já consegui codificar o nome do serviço:

location /awesome_service {
    rewrite ^/awesome_service(/.*)$ $1 break;
    proxy_pass http://awesome_service;
}

No entanto, tenho diferentes serviços com nomes diferentes e não quero duplicar as rotas.

Eu usei um mapa de nome para URL:

map $uri $service_url {
  ~^/awesome_service/ "http://awesome_service";
  ~^/mediocre_service/ "http://mediocre_service";
}

Por isso, é fácil enviar para um URL de proxy variável:

location /awesome_service {
    rewrite ^/awesome_service(/.*)$ $1 break;
    proxy_pass $service_url;
}

No entanto, ainda estou lutando com a reescrita.

Isso é o que eu criei até agora:

location ~ ^/([^\/]+)/.* {
    set $service $1;
    rewrite ^/$service(/.*)$ $1 break;
    proxy_pass $service_url;
}

A solicitação é capturada e transmitida. Mas a reescrita falha. O serviço ainda vê a primeira parte do URL.

Existe talvez uma confusão com o regex ou estou passando a variável errada?

    
por leifg 04.06.2014 / 18:58

1 resposta

1

O rewrite no seu bloco location é avaliado primeiro e, em seguida, proxy_pass é usado. Essa é a razão pela qual seu bloco map não funcionará com $uri . Porque quando o bloco map é acionado, o URL já está reescrito. Eu tenho essa configuração no meu laboratório que funciona como esperado:

map $custom_service $custom_backend {
        google "https://www.google.com";
        bing "https://www.bing.com";
}
location ~ ^/([^\/]+)/.* {
        set $custom_service $1;
        rewrite ^/[^\/]+(/.*)$ $1 break;
        proxy_pass $custom_backend;
}

O bloco map vai para o bloco http e o bloco location para o bloco server .

Seus URLs são assim:

http://nginx/google/some/params -> backend is now -> https://www.google.com/some/params
http://nginx/bing/some/params -> backend is now -> https://www.bing.com/some/params
    
por 02.03.2017 / 15:18