Điểm:1

nginx - cách đạt được chức năng "chuyển hướng 307 nội bộ"

lá cờ in

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.

Michael Hampton avatar
lá cờ cz
Vâng, đó là cách để làm điều đó. Câu trả lời tôi sắp viết sẽ giống hệt nhau. Tất nhiên bạn nên cung cấp 307 và URL của riêng bạn.
Brosilio avatar
lá cờ in
@MichaelHampton câu hỏi này không trùng lặp vì câu trả lời cho câu hỏi đó không hoạt động hoặc ít nhất, tôi không biết cách triển khai nó đúng cách.
Michael Hampton avatar
lá cờ cz
Không có gì trong câu hỏi của bạn về bất kỳ vấn đề nào bạn gặp phải khi thực hiện nó. Vui lòng chỉnh sửa câu hỏi của bạn để cung cấp các chi tiết có liên quan.
Brosilio avatar
lá cờ in
hóa ra những gì tôi muốn làm là cho phép hiệu quả các yêu cầu POST đối với các tệp tĩnh không được phép (có thể hiểu được) - cuối cùng đã viết một máy chủ web để chấp nhận các yêu cầu POST đối với các tệp tĩnh và chỉ proxy error_pages cho những người sử dụng các vị trí được đặt tên như bạn đã đề xuất .

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.