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?

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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.