NGINX Прокси с проверкой параметров - PullRequest
0 голосов
/ 03 марта 2020

Пожалуйста, помогите мне настроить конфигурацию 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";
        }
    }
}

Пожалуйста, помогите, есть ли лучшее решение?

...