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


15

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:업스트림으로부터받은 헤더 값을 포함해야합니다 .

이견있는 사람?

답변:


7

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

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

이 $ 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 블록을 사용하여 다음과 같은 오류가 발생 합니다.
Cyril Duchon-Doris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.