Назад | Перейти на главную страницу

Как следить за перенаправлением HTTP внутри nginx?

У меня есть HTTP-прокси на основе nginx, и я хотел бы обрабатывать все HTTP-перенаправления внутри него, чтобы клиенты получали только последний ответ в цепочке перенаправлений.

Базовый код выглядит так:

location /proxy {
    rewrite ^/proxy/([^/]+) $1 break;

    proxy_pass http://$uri/;
}

Моя попытка выполнить перенаправление 1 уровня такова:

error_page 301 302 307 =200 @redir;

... и имеющий это названное местоположение:

location @redir {
    proxy_pass $proxy_location;
}

Только там нет переменной $ proxy_location, и мне не удалось найти способ ее создания. Он должен содержать значение Location: заголовок, полученный от восходящего потока.

Есть предположения?

Вот полный пример того, что у меня сработало:

server {
    ...

    location / {
        proxy_pass http://backend;
        # You may need to uncomment the following line if your redirects are relative, e.g. /foo/bar
        #proxy_redirect / /;
        proxy_intercept_errors on;
        error_page 301 302 307 = @handle_redirect;
    }

    location @handle_redirect {
        set $saved_redirect_location '$upstream_http_location';
        proxy_pass $saved_redirect_location;
    }
}

Я считаю, что вам нужна переменная $ upstream_http_location.

Переменные, которые начинаются с $ proxy *, управляют тем, что идет от nginx к восходящему потоку. Серия переменных $ upstream * содержит информацию об ответе, который получает сам nginx. Вы можете получить любой произвольный HTTP-заголовок, полученный от вышестоящего сервера, с помощью $ upstream_http_headername.

Обратите внимание, что эти переменные $ upstream не могут быть ничем иным, кроме нуля, пока не будет получен ответ от вышестоящего сервера, поэтому существуют некоторые ограничения на их использование.