Redirecionamento Nginx para a porta especificada na URL

2

É possível usar o Nginx como proxy de um URL como este:

http://example.com/service/1234/foo.php?...

para um serviço interno como este:

http://example.com:1234/foo.php?...

Ou seja, extrair um número da URL e usá-lo como o número da porta para o mesmo servidor?

rewrite parece limitado a manipular a parte do URL após a porta e não acho que proxy_pass possa acessar uma substring regex a partir dele.

O problema específico que estou tentando resolver é ter todos os meus serviços acessíveis na porta 80, já que várias redes corporativas e públicas bloqueiam as portas exóticas nas quais os serviços realmente são executados. Então tem que ser um proxy reverso, não um redirecionamento.

Este método funciona para uma única porta:

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

Mas a questão é como tornar o 5010 apenas um parâmetro extraído do URL.

    
por Steve Bennett 15.02.2015 / 02:54

1 resposta

0

Algo como

    location / {
       set $proxy_port 8080;
       if ($uri ~ "^/service/([0-9]+)/.*$")
       {
           set $proxy_port $1;
           rewrite ^/service/[0-9]+/(.*)$ /$1 break;
       }
       proxy_pass http://127.0.0.1:$proxy_port;
    }

pelo menos funciona para mim no Nginx 1.6.2

    
por 15.02.2015 / 04:17