ฉันไม่แน่ใจว่าจะอธิบายฟังก์ชันการทำงานที่ฉันพยายามทำด้วยวิธีอื่นที่ไม่ใช่ "การเปลี่ยนเส้นทาง 307 ภายใน" ได้อย่างไร
ใช้ nginx's error_page
คำสั่งทำให้ nginx เปลี่ยนคำขอ POST เป็นคำขอ GET
ในการกำหนดค่าของฉัน พร็อกซี Nginx จะร้องขอไปยังเซิร์ฟเวอร์อัปสตรีมด้วย เปิด proxy_intercept_errors
เพื่อให้ฉันสามารถให้บริการหน้าแสดงข้อผิดพลาดจาก nginx
ตัวอย่าง:
error_page 500 502 503 =500 /50x.html;
ตำแหน่ง = /50x.html {
รูท / บาง / เอกสาร / รูท /;
}
ที่ตั้ง / {
เปิด proxy_intercept_errors;
proxy_pass https://ที่ไหนสักแห่ง;
}
ด้วยการกำหนดค่านั้น คำขอ POST ที่ส่งผลให้เกิด 500, 502 หรือ 503 บนพร็อกซีจะ "แอบ" กลายเป็นคำขอ GET ไปยัง URI ดั้งเดิม (/someurl)
นี่คือบรรทัดในบันทึก nginx ที่แสดงพฤติกรรมนี้ (ฉันได้เปลี่ยนรูปแบบบันทึกเพื่อแสดง $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"...
คุณจะเห็นว่า nginx เปลี่ยนคำขอ POST เป็นคำขอ GET
(อัปเดต: เห็นได้ชัดว่าเป็นเอกสาร nginx สำหรับ error_page บอกตามตรงว่า...)
หลังจากการค้นคว้าบางอย่าง ดูเหมือนว่านี่เป็นพฤติกรรมโดยเจตนาและเป็นผลจากการเปลี่ยนเส้นทางภายใน เห็นได้ชัดว่ารหัสตอบกลับ 307 และ 308 ถูกสร้างขึ้นเนื่องจากลักษณะการทำงานที่คล้ายกัน (แม้ว่าจะอยู่บนไคลเอนต์ ไม่ใช่เซิร์ฟเวอร์)
มีอะไรที่ฉันสามารถทำได้ที่จะมีฟังก์ชันของ "การเปลี่ยนเส้นทาง 307 ภายใน" หรือไม่ เช่น แสดงหน้าแสดงข้อผิดพลาดแต่รักษาวิธีการและเนื้อความคำขอไว้หรือไม่ ตัวอย่างเพื่อความชัดเจน:
ไคลเอนต์โพสต์ไปที่ /someurl เซิร์ฟเวอร์อัปสตรีมตอบสนองด้วย 500 nginx กลืนมันและให้บริการ "/mygreat500errorpage.html" ในขณะที่รักษาวิธีการร้องขอดั้งเดิม (POST) URI คำขอดั้งเดิม (/someurl) และเนื้อหาคำขอดั้งเดิม
อัปเดตในขณะที่ยังเขียนสิ่งนี้:
ฉันพบ นี้ คำตอบที่แนะนำให้ใช้บล็อกตำแหน่งที่มีชื่อเพื่อหลีกเลี่ยงการเปลี่ยนวิธีการร้องขอ ดูเหมือนว่าจะใช้งานได้โดยมีข้อยกเว้นว่าฉันไม่สามารถให้บริการ "/mygreat500errorpage.html" จากภายในตำแหน่งที่มีชื่อได้ ฉันไม่แน่ใจว่านี่เป็นวิธีที่ถูกต้องในการแก้ปัญหาหรือไม่ ดังนั้นฉันจะโพสต์คำถามนี้ต่อไป