Tôi không chắc làm thế nào để mô tả chức năng mà tôi đang cố đạt được theo cách khác ngoài "chuyển hướng 307 nội bộ".
Sử dụng nginx error_page
khiến nginx thay đổi yêu cầu POST thành yêu cầu GET.
Trong cấu hình của tôi, Nginx proxy yêu cầu một số máy chủ ngược dòng với bật proxy_intercept_errors
để tôi có thể phục vụ các trang lỗi từ nginx.
Ví dụ:
error_page 500 502 503 =500 /50x.html;
vị trí = /50x.html {
gốc /một số/tài liệu/gốc/;
}
địa điểm / {
bật proxy_intercept_errors;
proxy_pass https://somewhere;
}
Với cấu hình đó, các yêu cầu POST dẫn đến 500, 502 hoặc 503 trên proxy sẽ "bí mật" trở thành các yêu cầu GET đối với URI gốc (/someurl).
Đây là một dòng trong nhật ký nginx hiển thị hành vi này (Tôi đã thay đổi định dạng nhật ký để hiển thị $request_method):
1.2.3.4 - - [27/Sep/2021:10:04:50 -0400] request_method=GET "POST /someurl HTTP/1.1 500 123" https://domain.tld/someurl"...
Bạn có thể thấy rằng nginx đã thay đổi yêu cầu POST thành yêu cầu GET.
(Cập nhật: rõ ràng là tài liệu nginx cho error_page nói chính xác điều đó...)
Sau một số nghiên cứu, có vẻ như đây là hành vi cố ý và là kết quả của chuyển hướng nội bộ. Rõ ràng mã phản hồi 307 và 308 đã được tạo do hành vi tương tự (mặc dù trên máy khách, không phải máy chủ).
Tôi có thể làm bất cứ điều gì có chức năng của "chuyển hướng 307 nội bộ" không? tức là, phục vụ một trang lỗi nhưng giữ nguyên phương thức và nội dung yêu cầu? Ví dụ, cho rõ ràng:
Máy khách POST tới /someurl, máy chủ ngược dòng phản hồi với 500, nginx nuốt nó và phục vụ "/mygreat500errorpage.html" trong khi vẫn giữ nguyên phương thức yêu cầu ban đầu (POST), URI yêu cầu ban đầu (/someurl) và nội dung yêu cầu ban đầu.
Cập nhật, trong khi vẫn viết này:
tôi đã tìm thấy cái này câu trả lời gợi ý sử dụng khối vị trí được đặt tên để tránh thay đổi phương thức yêu cầu. Điều này dường như hoạt động với ngoại lệ là dường như tôi không thể phân phát "/mygreat500errorpage.html" từ bên trong vị trí được đặt tên. Tôi không chắc liệu đây có phải là cách giải quyết vấn đề chính xác hay không, vì vậy dù sao thì tôi cũng sẽ đăng câu hỏi này.