NGINX — использование sub_filter для изменения пути в блоке расположения прокси-сервера

#nginx #nginx-reverse-proxy #nginx-config #nginx-location

Вопрос:

Итак, у меня есть сервер NGNIX, который получает трафик из одного и того же местоположения (Akamai), и на основе пути входящего URL-адреса я отправляю трафик в разные приложения.

Я добавил новый источник в Akamai, и теперь это означает, что некоторые входящие запросы теперь имеют новый путь. Проблема в том, что моему приложению требуется, чтобы путь имел определенное значение.

Поскольку я делюсь слотом Akamai с другими источниками, я не могу отправить запрос по одному и тому же пути двум разным источникам, так как слот путается в том, на какой исходный сервер направлять трафик.

Поэтому я хотел бы изменить путь, прежде чем передавать его приложению. Я не уверен, как лучше всего это сделать, и мне нужна некоторая помощь. Должен ли я использовать перезапись, перенаправление или подфильтр?

На самом деле я пробовал все три, но мне чего-то не хватает в этой очень простой задаче.

 location /incoming_path {  max_ranges 0;  proxy_set_header Accept-Encoding "";  proxy_pass https://$upstream_application:9002;  proxy_ssl_server_name on;  proxy_ssl_certificate /etc/nginx/conf.d/server_cert.pem;  proxy_ssl_certificate_key /etc/nginx/conf.d/server_key.pem;  proxy_set_header Host $host;  proxy_set_header X-Real-IP $proxy_protocol_addr;  sub_filter_types *;  sub_filter "https://$proxy_host/incoming_path" "https://$host/new_path"  sub_filter_once on;  }  

Действительно был бы признателен за любые идеи/мысли о том, как этого достичь, заранее спасибо.

Ответ №1:

Похоже, это сработало:

 location /incoming_path {  max_ranges 0;  rewrite /incoming_path/(.*) /new_path/$1 break;  proxy_pass https://$upstream_application:9002;  proxy_ssl_server_name on;  proxy_ssl_certificate /etc/nginx/conf.d/server_cert.pem;  proxy_ssl_certificate_key /etc/nginx/conf.d/server_key.pem;  proxy_set_header Host $host;  proxy_set_header X-Real-IP $proxy_protocol_addr;  }  

Комментарии:

1. Вам даже не нужно переписывать URI, просто используйте proxy_pass https://$upstream_application:9002/new_path; . Почему вы ставите перед именами всех переменных косую черту? Это должно нарушить вашу конфигурацию, я не понимаю, как она может продолжать работать, используя их.

2. Они необходимы, так как конфигурационный файл создается в heredoc внутри скрипта docker entrypoint.

3. Я попытался установить proxy_pass, как было предложено выше, но это не сработало — я не стал продолжать расследование и переключился обратно на перезапись.