В настоящее время я пишу диспетчер, который будет отправлять различные URL-адреса на конкретные URL-адреса служб.
Я по сути хочу отправить что-то вроде:
POST http://nginx/awesome_service/a/lot/of/params/and?so=on
в
POST http://awesome_service/a/lot/of/params/and?so=on
Я уже добился жесткого кодирования названия сервиса:
location /awesome_service {
rewrite ^/awesome_service(/.*)$ $1 break;
proxy_pass http://awesome_service;
}
Однако у меня есть разные сервисы с разными именами, и я не хочу дублировать маршруты.
Я использовал карту от имени к URL:
map $uri $service_url {
~^/awesome_service/ "http://awesome_service";
~^/mediocre_service/ "http://mediocre_service";
}
Так что это легко отправить на URL-адрес переменной прокси:
location /awesome_service {
rewrite ^/awesome_service(/.*)$ $1 break;
proxy_pass $service_url;
}
Тем не менее, я все еще борюсь с переписыванием.
Это то, что я придумал до сих пор:
location ~ ^/([^\/]+)/.* {
set $service $1;
rewrite ^/$service(/.*)$ $1 break;
proxy_pass $service_url;
}
Запрос фиксируется и передается. Но переписать не удается. Служба по-прежнему видит первую часть URL.
Может быть, путаница с регулярным выражением или я передаю переменную неправильно?