3

В настоящее время я пишу диспетчер, который будет отправлять различные 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.

Может быть, путаница с регулярным выражением или я передаю переменную неправильно?

1 ответ1

1

rewrite в вашем блоке location получает оценку, а затем используется proxy_pass По этой причине ваш блок map не будет работать с $uri . Потому что, когда блок map срабатывает, URL уже переписан. У меня есть этот конфиг в моей лаборатории, которая работает как ожидалось:

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

Блок map переходит в блок http блок location блок server .

Ваши URL выглядят так:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .