nginx modify and proxy URL

Ngnix newbie here. Please I need some help to figure out how to correctly make nginx modify and redirect (proxy?) incoming requests. The redirection seems to work ok, but the URL is not rewritten at the destination.

My configuration is:

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

Im trying to get requests such as /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

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

1
задан 21 May 2018 в 18:46
1 ответ

Текущий метод не работает потому что вы пытаетесь захватить строку запроса в регулярном выражении директивы 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;
        ...
    }
}
3
ответ дан 3 December 2019 в 18:27

Теги

Похожие вопросы