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の値を新しい変数に保存する必要があったのですか?
パルスシャー

1
...私は正確な理由は分からないが、それはそうでない場合は動作しません
ヴラドフロロフ

これは素晴らしいことですが、単一のリダイレクトのみをキャッチします。複数のリダイレクトを処理する方法はありますか?
シーフマスター

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ブロックを使用すると、次のエラーが発生します。
シリルデュションドリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.