Nginx условный прокси-проход

Я пытаюсь настроить nginx на прокси-сервер, передавая запрос другому серверу, только если переменная $request_body соответствует определенному регулярному выражению.

Теперь моя проблема заключается в том, что я не могу точно настроить это поведение.

В настоящее время я дошел до этого:

server {
    listen 80 default;
    server_name test.local;

    location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $http_host;

            if ($request_body ~* ^(.*)\.test) {
                    proxy_pass http://www.google.de;
            }

            root /srv/http;
    }

}

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

любая идея о том, как я мог это сделать?

заблаговременно

Ответ 1

попробуйте следующее:

server {
    listen 80 default;
    server_name test.local;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;

        if ($request_body ~* ^(.*)\.test) {
            proxy_pass http://www.google.de;
            break;
        }

        root /srv/http;
    }

}

Ответ 2

Маршрутизация Nginx основана на директиве location, которая совпадает с URI запроса. Решение состоит в том, чтобы временно изменить это, чтобы перенаправить запрос на другие конечные точки.

server {
    listen 80 default;
    server_name test.local;

     if ($request_body ~* ^(.*)\.test) {
         rewrite ^(.*)$ /istest/$1;
     }

     location / {
         root /srv/http;
     }

     location /istest/ {
        rewrite ^/istest/(.*)$  $1 break;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://www.google.de;

    }
}

Условие if может безопасно использоваться только в Nginx с модулем перезаписи, частью которого он является. В этом примере. rewrite префиксы запроса URI с istest.

Блоки location дают приоритет ближайшему совпадению. Все, что соответствует /istest/, перейдет ко второму блоку, который использует другую rewrite для удаления /istest/ из URI запроса перед пересылкой в прокси восходящего потока.