Jak śledzić przekierowania HTTP wewnątrz nginx?

15

Mam proxy HTTP oparte na nginx i chciałbym przetwarzać wszystkie przekierowania HTTP wewnątrz niego, aby klienci otrzymywali tylko ostatnią odpowiedź w łańcuchu przekierowań.

Podstawowy kod wygląda następująco:

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

    proxy_pass http://$uri/;
}

Moja próba wykonania następujących przekierowań na poziomie 1 jest następująca:

error_page 301 302 307 =200 @redir;

... i posiadając tę ​​nazwaną lokalizację:

location @redir {
    proxy_pass $proxy_location;
}

Tylko, że nie ma zmiennej $ proxy_location i nie udało mi się znaleźć sposobu jej utworzenia. Powinien on zawierać wartość Location:nagłówka otrzymanego z góry.

jakieś pomysły?

Alex Kapranoff
źródło

Odpowiedzi:

7

Wierzę, że chcesz mieć zmienną $ upstream_http_location .

Zmienne zaczynające się od $ proxy * kontrolują, co przechodzi od nginx do upstream. Seria zmiennych $ upstream * zawiera informacje o odpowiedzi, którą otrzymuje sam nginx. Możesz dostać dowolny nagłówek HTTP otrzymany z serwera nadrzędnego za pomocą $ upstream_http_headername.

Zauważ, że te zmienne $ upstream nie mogą być niczym innym jak zero, dopóki odpowiedź nie zostanie odebrana z serwera upstream, więc istnieją pewne ograniczenia w ich użyciu.

rmalayter
źródło
26

Oto pełny przykład tego, co dla mnie zadziałało:

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;
    }
}
Vlad Frolov
źródło
1
Dlaczego musiałeś zapisać wartość $ upstream_http_location w nowej zmiennej?
Parth Shah,
1
Nie znam dokładnego powodu, ale nie działa inaczej ...
Vlad Frolov
Jest to świetne, ale łapie tylko jedno przekierowanie. Jakiś sposób obsługiwać wiele przekierowań?
ThiefMaster
1
@ ThiefMaster Wierzę, że ta odpowiedź jest tym, czego szukasz.
iBug
Otrzymuję następujący błąd 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"przy użyciu bloku @handle_redirect, jakiś pomysł?
Cyril Duchon-Doris