Мне нужен обратный прокси-сервер, способный пересылать запросы вышестоящим приложениям, которые имеют идентичную архитектуру, но не идентичны. Я не могу контролировать код, работающий на вышестоящем сервере. Это коммерческий продукт, который взаимодействует с доильными роботами. В течение последних 16 месяцев я использовал Nginx для пересылки восходящих запросов на один сервер, используя такой блок местоположения:
location /T4C {
proxy_pass http://192.168.10.4/T4C/;
proxy_read_timeout 90;
}
Он работает нормально, но, к сожалению, веб-приложение написано таким образом, что каждые 5 секунд оно перенаправляет вас на «http: //ip/T4C/Content/StartPage.aspx "Это означает, что имя моего местоположения всегда должно быть" / T4C ". Если я попробую / foo, он загрузит стартовую страницу, но как только сработает один из триггеров обновления, время ожидания доступа к / T4C / Content / StartPage.aspx Я пробовал использовать cookie:
location /crews {
add_header Set-Cookie targetip=192.168.10.4/; #Tried with and without the slash
proxy_pass http://127.0.0.1/T4C; }
location /T4C {
proxy_pass http://$cookie_targetip/T4C/; }#Tried with and without the slashes, all permutaions
Это приводит к циклу перенаправления или внутренней ошибке сервера 500 по причинам, которые я не совсем понимаю (я думаю, что 500 происходит, когда не установлен файл cookie)
Я также попробовал переписать, и в настоящее время изучаю это, но опять же, я не совсем понимаю механику.
Я также пробовал читать о «происхождении», но примеры кажутся либо A / B-тестированием, либо балансировкой нагрузки. Я хочу прояснить здесь, что пользователь должен иметь возможность выбирать через URL-адрес, к какому внутреннему серверу они подключаются, и затем этот выбор должен сохраняться, даже если браузер будет продолжать попытки направить его на / T4C / *** Я знаю, что идеальной ситуацией было бы изменить веб-приложение, но, к сожалению, это вне моего контроля. Все системы запрограммированы одинаково, и этот код не мой, и я не могу его изменить.
Надеюсь, я сформулировал внятный вопрос. Спасибо, что дочитали до этого места.
Андрей.
Я думаю, у меня это работает. Благодарим Анубойза за то, что он поместил меня в http_sub _module. Это действительно то, что мне было нужно. Я считаю, что я перехватываю перенаправления и меняю их URL. Я обнаружил, что URL-адрес содержит параметр, указывающий приложению, куда перенаправить.
location /CREWS/ {
proxy_pass http://192.168.10.4/T4C/;
proxy_read_timeout 90;
sub_filter_once off; #########This is important. Defaults to ON
sub_filter 'ReturnUrl=%2fT4C%2f' 'ReturnUrl=%2fCREWS%2f' ;
sub_filter '/T4C/' '/CREWS/' ;
sub_filter '/T4C/Content/Login.aspx?ReturnUrl=%2fT4C%2f' '/CREWS/Content/Login.aspx?ReturnUrl=%2fCREWS%2f';
sub_filter_types '*';
}
Вам нужен ngx_http_sub_module. Он не включен в исходный код nginx (но может быть включен в ваш дистрибутив Linux), поэтому вам, возможно, придется собрать nginx из исходного кода. Это позволяет субstitude произвольные строки в теле ответа.
Если я правильно понял, в вашем случае вам понадобится что-то вроде:
location /T4C {
proxy_pass http://127.0.0.1/T4C/;
proxy_read_timeout 90;
sub_filter '127.0.0.1' '192.168.10.4';
}