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


15

У меня есть 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:заголовка, полученного от апстрима.

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

Ответы:


7

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

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

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


26

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

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;
    }
}

1
Почему вам пришлось сохранить значение $ upstream_http_location в новой переменной?
Parth Shah

1
Я не знаю точной причины, но иначе это не сработает ...
Влад Фролов

Это здорово, но ловит только один редирект. Есть ли способ обработки нескольких перенаправлений?
ThiefMaster

1
@ThiefMaster Я верю, что этот ответ - то, что вы ищете.
iBug

Я получаю следующую ошибку, 2020/01/23 09:17:46 [error] 1394#0: *1 invalid URL prefix in "", client: xx.xx.28.3, server: www.example.com, request: "GET /test HTTP/1.1", host: "www.example.com"используя блок @handle_redirect, любая идея?
Кирилл Дюшон-Дорис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.