Горячее изменение «Местоположение» в заголовке ответа 302 кода от прокси-хоста. - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть кластер kubernetes и несколько контейнеров / контейнеров с веб-приложением. Блоки подключаются друг к другу по имени модуля с портом прослушивания 9999 (например, security-rest-api: 9999, common-rest-api: 9999 и т. Д.). Снаружи слушать nginx-pod с внешним адресом http://e.net:30200/.

((приложение стручки: 9999) - (Nginx-стручок: 80) - (Nginx-служба: 30200)) - сеть

Nginx использует следующую конфигурацию для взаимодействия с приложениями.

    server {

    listen       80;
    server_name  e.net;

    location / {
        proxy_pass              http://web-console:9999/;
        proxy_redirect          http://web-console:9999/ http://e.net:30200/;  
    }

    location /common {
        proxy_pass              http://common-rest-api:9999/common;
        proxy_redirect          http://common-rest-api:9999/ http://e.net:30200/;  

    }

    location /security {
        proxy_pass              http://security-rest-api:9999/security;
        proxy_redirect          http://security-rest-api:9999/ http://e.net:30200/;     

    } }

Работает очень хорошо, но у меня есть одна проблема с 302-ответом от app-pods:

Если я попытаюсь войти в свое приложение, я получу следующий 302 заголовок ответа:

HTTP/1.1 302 Found
Connection: keep-alive
Content-Length: 0
Date: Wed, 25 Apr 2018 10:37:50 GMT
Location: http://e.net:30200/security/rest/auth/login.html?callbackUrl=http://security-rest-api:9999/security/rest/namespace
Server: nginx/1.13.9

App-pods сгенерировал параметр URL "callbackUrl" из заголовка запроса Host Внутри сети контейнеров и этот параметр URL, чтобы добраться до браузера конечной точки. Конечно, при следующем запросе получите код 404.

Я не могу редактировать код приложения (в app-pods не используется nginx), но я хочу изменить параметр «security-rest-api: 9999» на «e.net:30200» в местоположении 302 заголовок ответа. Как я могу это сделать?

редирект не подходит, так как это генерирует новый 302-ответ и не решает мою проблему. sub_filter меняет только тело ответа, но не заголовок ответа (где находится параметр Location). request_uri тоже не работает, так как этот параметр работает только с заголовком запроса.

1 Ответ

0 голосов
/ 02 мая 2018

Нет, это не работает.

Я проверил эту ситуацию и нашел конфигурацию поиска:

if ($args ~* (.*)(callbackUrl=http://security-rest-api:9999/)(.*)) {
    set $args $1callbackUrl=http://e.net:30200/$3;
    rewrite ^(.*)$ $1;
}
if ($args ~* (.*)(callbackURL=http%3A%2F%2Fsecurity-rest-api%3A9999%2F)(.*)) {
    set $args $1callbackURL=http%3A%2F%2Fe.net%3A30200%2F$3;
    rewrite ^(.*)$ $1;
}


location /security {
    proxy_pass http://security-rest-api:9999/security;
    proxy_set_header Host $http_host;
    proxy_redirect http://security-rest-api:9999/ http://e.net:30200/;

}

Позже я попытаюсь использовать эту конфигурацию на подготовительном стенде, и еслиэта работа (или работа после исправления) - я напишу это здесь.

Спасибо за справочную информацию: https://blog.imaginea.com/modifying-query-parameters-nginx-in-reverse-proxy-mode/

И спасибо вам всем тоже!

Редактировать

Я протестировал этот конфиг и у меня есть 2 редактирования:

  1. Если вы используете нестандартный порт - вам нужно написать "proxy_set_header Host $ http_host;"в разделе местоположения;
  2. URL-адрес в атрибутах может быть как "http://security -rest-api: 9999 / " и как "http% 3A% 2F% 2Fsecurity-rest-api% 3A9999% 2F».Вам необходимо использовать оба условия для каждого типа атрибута.

Я исправил код с помощью этих правок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...