Назад | Перейти на главную страницу

Nginx перенаправляет на порт, указанный в URL

Можно ли использовать Nginx для прокси с такого URL-адреса:

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

во внутреннюю службу вроде этого:

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

То есть извлечь номер из URL-адреса и использовать его в качестве номера порта для того же сервера?

rewrite похоже, ограничивается манипулированием частью URL-адреса после порта, и я не думаю, что proxy_pass может получить доступ к подстроке регулярного выражения из него.

Конкретная проблема, которую я пытаюсь решить, заключается в том, чтобы все мои службы были доступны через порт 80, поскольку различные корпоративные и общедоступные сети блокируют экзотические порты, на которых фактически работают службы. Так что это должен быть обратный прокси, а не перенаправление.

Этот метод работает для одного порта:

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

Но вопрос в том, как сделать 5010 просто параметром, извлеченным из URL.

Что-то вроде

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

по крайней мере, у меня это работает на Nginx 1.6.2