Новичок 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;
...
}
}