Назад | Перейти на главную страницу

изменение nginx и URL-адрес прокси

Новичок Ngnix здесь. Пожалуйста, мне нужна помощь, чтобы понять, как правильно заставить nginx изменять и перенаправлять (прокси?) Входящие запросы. Перенаправление работает нормально, но URL-адрес не перезаписывается в месте назначения.

Моя конфигурация:

        server {

       listen 91 default_server ssl;

       ssl_prefer_server_ciphers on;
       ssl_certificate /etc/nginx/ssl/domain.crt;
       ssl_certificate_key /etc/nginx/ssl/domain.key;

        location /dest {

        rewrite ^a_service_prod&id_number=((1234701|1234708|1234802|1234808|1234812|1234902)\d+)&(.*?)$ /dest?service=a_service_prod.sub_service&operation=sub_service&id_number=$1&$2 break;
            proxy_pass http://192.168.1.1:1440;
            proxy_redirect off;
            proxy_set_header Host $host;
        }
    }

Я пытаюсь получить такие запросы, как /dest?service=a_service_prod&id_number=12347016734696&slime=somethig быть переписан и запрос отправлен на другой сервер как http://192.168.1.1:1440/dest?service=a_service_prod.sub_service&operation=sub_service&id_number=12347016734696&slime=somethig

Но вместо этого в пункте назначения получено то, что http://192.168.1.1:1440/dest?service=a_service_prod&id_number=12347016734696&slime=somethig

Пожалуйста, что я делаю не так и как это исправить?

Ваш текущий метод не работает, потому что вы пытаетесь захватить строку запроса в регулярном выражении rewrite директива. nginx использует нормализованный URI для оценки rewrite и location директивы, которые не включают ? и все, что следует за ним.

Вы можете найти строку запроса в $request_uri переменная, $args переменной - или разделить между $arg_xxx переменные. Видеть этот документ для подробностей.

Вы можете применить регулярное выражение к одной из этих переменных, используя if заявление или map директива.

В приведенном ниже примере используется map директива (см. этот документ для деталей) с регулярным выражением и двумя именованными захватами для восстановления необходимого списка аргументов. URI восходящего потока добавляется к proxy_pass директива (см. этот документ подробнее).

map $args $newargs {
    default $args;
    ~*^(?<prefix>service=a_service_prod)&(?<suffix>id_number=(?:1234701|1234708|1234802|1234808|1234812|1234902)\d+&.*)$  $prefix.sub_service&operation=sub_service&$suffix;
}
server {
    ...
    location /dest {
        proxy_pass http://192.168.1.1:1440$uri?$newargs;
        ...
    }
}