У меня есть 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 не могут быть ничем иным, кроме нуля, пока не будет получен ответ от вышестоящего сервера, поэтому существуют некоторые ограничения на их использование.