Nginx местоположение с регулярным выражением в середине пути - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь настроить Nginx для правильного анализа двух похожих путей с регулярным выражением.

У меня есть 2 службы:

  • / api / v1 / myservice / {var} / client
  • / api / v1 / myservice / {var} / client / detail

{var} - это переменная, которую я читаю и которая работает

Вот мой код (здесь не используется переменная):

location ~ /api/v1/myservice/(.*)/client {
     return 200 "service 1 ";
}

location ~ /api/v1/myservice/(.*)/client/detail {
     return 200 "service 2";
}

Когда я запускаю curl, как показано ниже:

curl http://localhost/api/v1/myservice/623723852/client/detail

Я вижу ответ из первого местоположения: «Сервис 1»

Что я делаю не так? спасибо

1 Ответ

0 голосов
/ 14 февраля 2020

Нет необходимости иметь вложенные местоположения, как в другом ответе. Вложенные местоположения в NGINX часто дают ложное представление о наследовании директив. Чаще всего они не наследуются, потому что NGINX в любом случае выбирает один спецификатор c location. По этим причинам, если вы можете, избегайте вложенных расположений.

Вы можете просто изменить порядок расположений, чтобы более конкретный c был первым. NGINX будет соответствовать тому, который появляется первым в конфигурации (если они оба совпадают):

location ~ /api/v1/myservice/(.*)/client/detail {
     return 200 "service 2";
}

location ~ /api/v1/myservice/(.*)/client {
     return 200 "service 1 ";
}

В качестве альтернативы, несколько лучше (по соображениям производительности), вы можете настроить свои регулярные выражения для более точного соответствия. Тогда размещение в конфигурации не имеет значения:

location ~ ^/api/v1/myservice/(.*)/client$ {
     return 200 "service 1 ";
}

location ~ ^/api/v1/myservice/(.*)/client/detail$ {
     return 200 "service 2";
}
...