Bagaimana cara mengikuti arahan HTTP di dalam nginx?

15

Saya memiliki proxy HTTP berbasis nginx dan saya ingin memproses semua pengalihan HTTP di dalamnya sehingga klien hanya mendapatkan respons terakhir dalam rantai pengalihan.

Kode dasar terlihat seperti:

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

    proxy_pass http://$uri/;
}

Upaya saya untuk mengikuti 1 arahan ulang adalah ini:

error_page 301 302 307 =200 @redir;

... dan memiliki lokasi bernama ini:

location @redir {
    proxy_pass $proxy_location;
}

Hanya saja tidak ada variabel $ proxy_location dan saya gagal menemukan cara membuatnya. Seharusnya berisi nilai Location:header yang diterima dari hulu.

Adakah pikiran?

Alex Kapranoff
sumber

Jawaban:

7

Saya yakin Anda ingin variabel $ upstream_http_location .

Variabel yang dimulai dengan $ proxy * mengontrol apa yang berjalan dari nginx ke hulu. Rangkaian variabel $ upstream * berisi informasi tentang respons yang diterima nginx sendiri. Anda bisa mendapatkan tajuk HTTP sembarang yang diterima dari server upstream dengan $ upstream_http_headername.

Perhatikan bahwa variabel $ upstream ini tidak bisa apa-apa selain nol sampai respons diterima dari server upstream, jadi ada beberapa batasan dalam penggunaannya.

rmalayter
sumber
26

Berikut adalah contoh lengkap dari apa yang berhasil untuk saya:

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
sumber
1
Mengapa Anda harus menyimpan nilai $ upstream_http_location dalam variabel baru?
Parth Shah
1
Saya tidak tahu alasan pastinya, tetapi tidak berhasil sebaliknya ...
Vlad Frolov
Ini hebat tetapi hanya menangkap satu pengalihan. Adakah cara untuk menangani beberapa arahan ulang?
ThiefMaster
1
@ThiefMaster Saya yakin jawaban ini adalah yang Anda cari.
iBug
Saya mendapatkan kesalahan berikut 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"menggunakan blok @handle_redirect, ada ide?
Cyril Duchon-Doris