11

Chúng tôi có một vài phụ trợ ngồi phía sau đầu nginx của chúng tôi.Ngăn chặn chuyển hướng phụ trợ 301/302 (proxy_pass) và viết lại một khối vị trí khác có thể?

Có thể chặn chuyển hướng 301/302 được gửi bởi các chương trình phụ trợ này và có nginx xử lý chúng không?

Chúng tôi đã thinging một cái gì đó một mình theo dòng:

error_page 302 = @target; 

Nhưng tôi nghi ngờ 301/302 chuyển hướng có thể được xử lý giống như 404 của etc etc ... Ý tôi là, error_page lẽ doesnt áp dụng cho 200, vv mã lỗi?

Vì vậy, để tóm tắt:

Các chương trình phụ trợ của chúng tôi gửi lại 301/302 lần một lần. Chúng tôi muốn có nginx đánh chặn chúng, và viết lại chúng vào một khối địa điểm khác, nơi chúng tôi có thể làm bất kỳ số thứ nào khác với chúng.

Có thể?

Cảm ơn!

Trả lời

10

Bạn có thể sử dụng proxy_redirect chỉ:

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

Nginx vẫn sẽ trở lại 301/302 cho khách hàng nhưng proxy_redirect sẽ sửa đổi Location header và khách hàng nên thực hiện một yêu cầu mới đến URL được đưa ra trong Location tiêu đề.

Something như thế này nên làm cho yêu cầu tiếp theo trở lại nginx:

proxy_redirect http://upstream:port/ http://$http_host/;

2

tôi đã thành công trong việc giải quyết một trường hợp chung chung hơn khi một vị trí chuyển hướng có thể được bất kỳ URL bên ngoà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_redirects; 
    } 

    location @handle_redirects { 
     set $saved_redirect_location '$upstream_http_location'; 
     proxy_pass $saved_redirect_location; 
    } 
} 

cách tiếp cận thay thế, đó là gần gũi hơn với những gì bạn mô tả, được bao phủ trong câu trả lời ServerFault cho câu hỏi này: https://serverfault.com/questions/641070/nginx-302-redirect-resolve-internally

0

Nếu bạn cần phải làm theo nhiều chuyển hướng, thay đổi giải pháp Vlad như sau:

1) Thêm

recursive_error_pages on; 

to location /.

2) Thêm

proxy_intercept_errors on; 
    error_page 301 302 307 = @handle_redirect; 

đến phần location @handle_redirects.

Các vấn đề liên quan