[server] nginx 내에서 HTTP 리디렉션을 따르는 방법은 무엇입니까?

nginx 기반 HTTP 프록시가 있으며 클라이언트가 리디렉션 체인의 마지막 응답 만 얻도록 모든 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:업스트림으로부터받은 헤더 값을 포함해야합니다 .

이견있는 사람?



답변

변수 $ upstream_http_location 을 원한다고 생각합니다 .

$ proxy *로 시작하는 변수는 nginx에서 업스트림으로가는 것을 제어합니다. $ upstream * 변수 시리즈에는 nginx 자체가받는 응답에 대한 정보가 들어 있습니다. $ upstream_http_headername으로 업스트림 서버에서받은 임의의 HTTP 헤더를 얻을 수 있습니다.

이 $ upstream 변수는 업스트림 서버에서 응답을받을 때까지 null이 될 수 없으므로 사용에 제한이 있습니다.


답변

나를 위해 일한 것의 전체 예는 다음과 같습니다.

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


답변