Пожалуйста, помогите мне настроить конфигурацию nginx для правильной прокси. Суть в том, что есть URL-адрес: api.site.com/instance104114/method. И я хочу сделать это, nginx анализирует значение цифры c из URL-адреса, в данном случае 104114, и на основе значения из этого числа перенаправляет на соответствующий URL Что-то вроде:
server {
listen 80;
server_name site.com www.site.com;
location / {
proxy_pass http://localhost:5004;
}
location /instance($idInstance) {
if($idInstance <= 5000){
proxy_pass http://localhost:5005;
}else if($idInstance <=10000){
proxy_pass http://localhost:5006;
}
... ...
}
}
Неужели делать что-то подобное?
В общем, мы нашли, какой велосипед изобретен. Погуглил здесь , что если сравнения в nginx можно сделать только с регулярными выражениями. Соответственно, решение родилось, вероятно, оно не рационально, но оно работает.
Здесь , мы генерируем регулярное выражение для диапазона чисел. И используйте эту закономерность в конфигурации. Попробуйте на локальном хосте просто добавить заголовок, чтобы убедиться, что условие работает. Но решение ужасное, я его понимаю сам.
server {
listen 80;
server_name twa.com www.twa.com;
root /var/www/twa;
location / {
add_header Test "0";
}
location ~* ^/instance(\d+)/index.html$ {
# the fact that in parentheses becomes $1, we write the value to the $tmp variable (directly $1 does not work)
set $tmp $1;
# range of identifiers from 1 to 10000
if ($tmp ~* "\b([1-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9]|[1-8][0-9]{3}|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9]|10000)\b") {
add_header Test "do 10000";
}
# identifier range from 10001 to 20000
if ($tmp ~* "\b(1000[1-9]|100[1-9][0-9]|10[1-9][0-9]{2}|1[1-9][0-9]{3}|20000)\b") {
add_header Test "posle 10000";
}
}
}
Пожалуйста, помогите, есть ли лучшее решение?