Правило перезаписи обратного прокси NGINX с proxy_redirect

Я использую NGINX как обратный прокси перед некоторыми приложениями, размещенными на IIS. Моя цель - создать правило перезаписи для определенного места. Дело в том, что само приложение в некоторых случаях отвечает 301 или 302. Это доставляет новый заголовок местоположения, к которому мне также нужно обратиться.

В основном я пытаюсь сделать следующее: - https://mydemo.app.de/abc должен появиться в браузере, но / xyz должен быть доставлен вместо / abc. Это хорошо работает, даже если есть перенаправление (301/302).

Вот моя "наполовину рабочая" конфигурация:

    location ~* /abc {

        rewrite (?i)/abc/(.*) /xyz/$1 break;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;

        proxy_pass http://mydemo.app.local;
        proxy_redirect ~*(.*)\/xyz\/(.*) $1/abc/$2;
        proxy_pass_header   Server;

        # Handle Web Socket connections
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

Теперь иногда вышестоящий сервер возвращает следующее: login.aspx? ReturnUrl = / xyz /, который можно прочитать в браузере. Так быть не должно. Также должен быть / abc /. Насколько я понимаю, часть proxy_redirect должна справиться с этим, но как-то не в моем случае.

Есть ли способ заставить это работать без изменений в самом приложении (что привело бы к большим изменениям ...)?

Любая помощь приветствуется.

0
задан 24 February 2020 в 12:32
1 ответ

Если у вас есть два экземпляра текстовой последовательности /xyz/, которые нужно заменить на /abc/, вам потребуется составить обычную выражение, которое соответствует обоим и фиксирует три промежуточных пробелов.

Но вам нужно будет сохранить существующий оператор proxy_redirect для обработки случая, когда он только один.

Как и во многих директивах Nginx, которые оценивают регулярные выражения, порядок, вероятно, важен, поэтому я бы поместил более конкретное выражение первым.

Например:

proxy_redirect ~*(.*)/xyz/(.*)/xyz/(.*)$ $1/abc/$2/abc/$3;
proxy_redirect ~*(.*)/xyz/(.*)$ $1/abc/$2;
0
ответ дан 2 March 2020 в 09:37

Теги

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