ฉันพบวิธีแก้ไขปัญหาถัดไป คุณสามารถหลีกเลี่ยงการเปลี่ยนเส้นทางหลังจากดำเนินการPOSTตามคำขอโดยจัดการhistoryวัตถุ
ดังนั้นคุณมีรูปแบบ HTML:
<form method=POST action='/process.php'>
<input type=submit value=OK>
</form>
เมื่อคุณประมวลผลแบบฟอร์มนี้บนเซิร์ฟเวอร์ของคุณคุณแทนที่จะเปลี่ยนเส้นทางผู้ใช้ไปยัง/the/result/pageโดยการตั้งค่าLocationส่วนหัวเช่นนี้:
$cat process.php
<?php
process POST data here
...
header('Location: /the/result/page');
exit();
?>

หลังจากประมวลผลPOSTข้อมูล ed คุณแสดงผลขนาดเล็ก<script>และผลลัพธ์/the/result/page
<?php
process POST data here
render the <script> // see below
render `/the/result/page` // OK
?>
<script>คุณควรทำให้:
<script>
window.onload = function() {
history.replaceState("", "", "/the/result/page");
}
</script>
ผลลัพธ์คือ:

ในขณะที่คุณสามารถดูข้อมูลแบบฟอร์มถูกPOSTเอ็ดprocess.phpสคริปต์
สคริปต์นี้กระบวนการPOSTed ข้อมูลและแสดงผล/the/result/pageได้ในครั้งเดียวด้วย:
- ไม่มีการเปลี่ยนเส้นทาง
- ไม่มี
POSTข้อมูลอีกเมื่อคุณรีเฟรชหน้า (F5)
- ไม่
POSTเมื่อคุณนำทางไปยังหน้าก่อนหน้า / ถัดไปผ่านประวัติเบราว์เซอร์
UPD
ฉันขอให้ฟีเจอร์ขอให้ทีมMozilla FireFoxช่วยให้ผู้ใช้สามารถตั้งค่าNextPageส่วนหัวซึ่งจะทำงานเหมือนLocationส่วนหัวและสร้างpost/redirect/getรูปแบบล้าสมัย
ในระยะสั้น เมื่อเซิร์ฟเวอร์ประมวลผลPOSTข้อมูลในแบบฟอร์มสำเร็จแล้ว:
- ตั้งค่า
NextPageส่วนหัวแทนLocation
- แสดงผลลัพธ์ของการประมวลผล
POSTข้อมูลในแบบฟอร์มที่จะแสดงผลสำหรับการGETร้องขอในpost/redirect/getรูปแบบ
เบราว์เซอร์ในทางกลับกันเมื่อเห็นNextPageส่วนหัว:
- ปรับ
window.locationด้วยNextPageค่า
- เมื่อผู้ใช้รีเฟรชหน้าเบราว์เซอร์จะเจรจา
GETขอNextPageแทนPOSTข้อมูลแบบฟอร์มใหม่
ฉันคิดว่าสิ่งนี้จะยอดเยี่ยมหากใช้งานจะไม่? =)