Làm cách nào để theo dõi chuyển hướng HTTP bên trong nginx?


15

Tôi có proxy HTTP dựa trên nginx và tôi muốn xử lý tất cả các chuyển hướng HTTP bên trong nó để khách hàng chỉ nhận được phản hồi cuối cùng trong chuỗi chuyển hướng.

Mã cơ bản trông như:

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

    proxy_pass http://$uri/;
}

Nỗ lực của tôi ở các chuyển hướng 1 cấp sau đây là:

error_page 301 302 307 =200 @redir;

... và có vị trí được đặt tên này:

location @redir {
    proxy_pass $proxy_location;
}

Chỉ không có biến $ proxy_location và tôi không thể tìm ra cách tạo nó. Nó nên chứa giá trị của Location:tiêu đề nhận được từ thượng nguồn.

Có suy nghĩ gì không?

Câu trả lời:


7

Tôi tin rằng bạn muốn biến $ upstream_http_location .

Các biến bắt đầu bằng $ proxy * kiểm soát những gì đi từ nginx đến thượng nguồn. Chuỗi biến $ ngược dòng chứa thông tin về phản hồi mà chính nginx nhận được. Bạn có thể nhận được bất kỳ tiêu đề HTTP thông thường nào nhận được từ một máy chủ ngược dòng với $ upstream_http_headername.

Lưu ý rằng các biến $ ngược dòng này không thể là bất cứ thứ gì ngoài null cho đến khi nhận được phản hồi từ máy chủ ngược dòng, do đó, có một số hạn chế trong việc sử dụng chúng.


26

Dưới đây là ví dụ đầy đủ về những gì làm việc cho tôi:

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
Tại sao bạn phải lưu giá trị của $ upstream_http_location trong một biến mới?
Parth Shah

1
Tôi không biết lý do chính xác, nhưng nó không hoạt động khác ...
Vlad Frolov

Điều này là tuyệt vời nhưng chỉ bắt được một chuyển hướng duy nhất. Bất kỳ cách nào để xử lý nhiều chuyển hướng?
ThiefMaster

1
@ThiefMaster Tôi tin rằng câu trả lời này là những gì bạn đang tìm kiếm.
iBug

Tôi có nhận được lỗi sau khi 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"sử dụng khối @handle_redirect không?
Cyril Duchon-Doris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.