กลับไปหน้าที่แล้วที่มีส่วนหัว (“ ตำแหน่ง:”); ใน PHP


124

ชื่อคำถามประเภทนี้อธิบายคำถามของฉัน ฉันจะเปลี่ยนเส้นทางผู้เยี่ยมชมหน้า PHP กลับไปที่หน้าก่อนหน้าด้วยไฟล์header( "Location: URL of previous page" );


ส่วนหัว ('ตำแหน่ง:'. $ _SERVER ['HTTP_REFERER']);
raskul

ตามแหล่งที่มานี้w3schools.com/php/php_superglobals_server.aspไม่น่าเชื่อถือเพราะผู้ขายบางรายไม่สนับสนุน
mohadennis

คำตอบ:


246

ลอง:

header('Location: ' . $_SERVER['HTTP_REFERER']);

โปรดทราบว่าสิ่งนี้อาจใช้ไม่ได้กับเพจที่ปลอดภัย (HTTPS) และโดยรวมแล้วเป็นความคิดที่ไม่ดีเลยเนื่องจากส่วนหัวสามารถถูกไฮแจ็คส่งผู้ใช้ไปยังปลายทางอื่น เบราว์เซอร์อาจไม่ส่งส่วนหัวด้วยซ้ำ

ตามหลักการแล้วคุณจะต้อง:

  • ต่อท้ายที่อยู่ที่ส่งคืนไปยังคำขอเป็นตัวแปรการค้นหา (เช่น? back = / list)
  • กำหนดหน้าส่งคืนในรหัสของคุณ (เช่นการส่งแบบฟอร์มที่ประสบความสำเร็จทั้งหมดจะเปลี่ยนเส้นทางไปยังหน้ารายชื่อ)
  • ให้ทางเลือกแก่ผู้ใช้ว่าต้องการไปที่ไหนต่อไป (เช่นบันทึกและแก้ไขต่อหรือเพียงแค่บันทึก)

19
เรื่องแปลก ๆ เกิดขึ้น :)
Dimitry

3
@Col เพื่อให้คุณสามารถพิสูจน์ปัญหาในทางปฏิบัติได้หรือไม่?
Pekka

1
การใช้ตัวอ้างอิงหลังจากการทดสอบก่อนหน้านี้ว่ามีการตั้งค่าและถูกต้องหรือไม่ในบริบทแบบเพจต่อเพจที่กำหนดไว้อาจเป็นแนวทางปฏิบัติที่ยอมรับได้โดยสมบูรณ์เบราว์เซอร์ส่วนใหญ่จะส่ง HTTP_REFERER ที่เหมาะสมไปด้วย
Pekka

1
@Col ฉันใช้สิ่งนี้ในการผลิตเมื่อฉันต้องทำอะไรบางอย่างเพื่อสาธิต ดังที่คุณเห็นจากคำตอบของฉันฉันมีวิธีแก้ปัญหาอีกสามวิธีที่ฉันจะหันไปใช้แทนการเปลี่ยนเส้นทางตาม HTTP_REFERER
Dimitry

2
@Madmartigan ที่ฟังดูเหมือนพฤติกรรมแปลก ๆ คำใบ้เดียวที่ฉันเห็นในเน็ตทำให้เกิดปัญหาในการเปลี่ยนเส้นทาง อย่างไรก็ตามฉันยอมรับว่าการใช้ผู้อ้างอิงไม่ใช่วิธีหากคุณต้องการความปลอดภัย 100%
Pekka

22

มันง่ายมากเพียงแค่ใช้สิ่งนี้

header("location:javascript://history.go(-1)");

มันทำงานได้ดีสำหรับฉัน


2
สิ่งนี้ฟังดูฉลาดจริงๆ แต่ใน FF10 ฉันเข้าใจ"Corrupted Content Error The page you are trying to view cannot be shown because an error in the data transmission was detected."แล้วนี่จึงใช้ไม่ได้โดยทั่วไป
Wesley Murch

Wesley Murch ทำงานได้ดีสำหรับฉันในเกือบทุกเบราว์เซอร์หลักรวมถึงเบราว์เซอร์ที่คุณกล่าวถึง ใช้งานได้เฉพาะสำหรับคุณเท่านั้นในกรณีที่คุณเข้ามาในหน้าเว็บที่มีบางอย่างในประวัติศาสตร์
Hammad

5
ซึ่งอาจทำให้หน้าก่อนหน้านี้ถูกเรียกใช้จากแคชของเบราว์เซอร์
aksu

14

คุณต้องบันทึกตำแหน่งนั้นไว้

สมมติว่าเป็นแบบฟอร์ม POST เพียงใส่ตำแหน่งปัจจุบันในช่องที่ซ่อนอยู่จากนั้นใช้ในheader()ตำแหน่ง


14

เพียงเล็กน้อยเพิ่มเติม: ฉันเชื่อว่ามันเป็นเรื่องธรรมดาและเป็นที่รู้จักในการเพิ่มexit;หลังจากฟังก์ชั่นส่วนหัวในกรณีที่เราไม่ต้องการให้โค้ดที่เหลือโหลดหรือรัน ...

header('Location: ' . $_SERVER['HTTP_REFERER']);
exit;

มันก็แค่ "" สำหรับฉัน
Alexander Guo


1

การจัดเก็บ url ก่อนหน้าในตัวแปรเซสชันไม่ดีเนื่องจากผู้ใช้อาจคลิกขวาบนหลาย ๆ เพจแล้วกลับมาบันทึก

เว้นแต่คุณจะบันทึก url ก่อนหน้าในตัวแปรเซสชันลงในฟิลด์ที่ซ่อนอยู่ในรูปแบบและหลังจากบันทึกส่วนหัว ("ตำแหน่ง: บันทึก URL ของหน้าการโทร");


ทำไมเราใช้ $ _SERVER ['http_referrer'] ไม่ได้
Vignesh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.