Quay lại trang trước với tiêu đề (Vị trí trên đường: trực tiếp); trong PHP


124

Tiêu đề của loại câu hỏi này giải thích câu hỏi của tôi. Làm cách nào để chuyển hướng khách truy cập trang PHP trở lại trang trước của họ vớiheader( "Location: URL of previous page" );


tiêu đề ('Vị trí:'. $ _SERVER ['HTTP_REFERER']);
raskul

Theo nguồn này w3schools.com/php/php_superglobals_server.asp , nó không đáng tin cậy vì không phải tất cả các nhà cung cấp đều hỗ trợ nó
mohadennis

Câu trả lời:


246

thử:

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

Lưu ý rằng điều này có thể không hoạt động với các trang bảo mật (HTTPS) và đó là một ý tưởng khá tồi về tổng thể vì tiêu đề có thể bị chiếm quyền điều khiển, đưa người dùng đến một số đích khác. Tiêu đề thậm chí có thể không được gửi bởi trình duyệt.

Lý tưởng nhất là bạn sẽ muốn:

  • Nối địa chỉ trả lại vào yêu cầu dưới dạng biến truy vấn (ví dụ:? Back = / list)
  • Xác định trang trả về trong mã của bạn (ví dụ: tất cả các lần gửi biểu mẫu thành công chuyển hướng đến trang danh sách)
  • Cung cấp cho người dùng tùy chọn nơi họ muốn đi tiếp theo (ví dụ: Lưu và tiếp tục chỉnh sửa hoặc chỉ Lưu)

19
Những điều lạ lùng đã xảy ra :)
Dimitry

3
@Col để bạn có thể chứng minh một vấn đề thực tế với điều này?
Pekka

1
Sử dụng tham chiếu, sau khi kiểm tra trước xem nó có được đặt và hợp lệ hay không, trong bối cảnh trang được xác định có thể là một cách thực hành hoàn toàn chấp nhận được - đại đa số các trình duyệt sẽ gửi HTTP_REFERER phù hợp.
Pekka

1
@Col Tôi đã sử dụng điều này trong sản xuất khi tôi phải hoàn thành một bản demo. Như bạn có thể thấy từ câu trả lời của mình, tôi cung cấp ba giải pháp khác mà tôi sẽ chuyển sang thay vì chuyển hướng dựa trên HTTP_REFERER.
Dimitry

2
@Madmartigan nghe có vẻ như là hành vi thực sự kỳ lạ, gợi ý duy nhất tôi có thể thấy trên mạng 'gây ra nó là một số vấn đề chuyển hướng. Dù sao, tôi đồng ý rằng sử dụng người giới thiệu không phải là cách nếu bạn cần an toàn 100%
Pekka

22

Nó rất đơn giản chỉ cần sử dụng này

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

Nó hoạt động tốt với tôi


2
Điều này nghe có vẻ rất thông minh, nhưng trong FF10 tôi nhận được "Corrupted Content Error The page you are trying to view cannot be shown because an error in the data transmission was detected."Vì vậy, điều này về cơ bản là không thể sử dụng được.
Wesley Murch

Wesley Murch, nó hoạt động tốt với tôi trong hầu hết mọi trình duyệt chính bao gồm cả trình duyệt mà bạn đã đề cập. Nó chỉ hoạt động cho bạn trong trường hợp bạn đến trang có một cái gì đó trong lịch sử.
Hammad

5
Điều này có thể khiến trang trước được phục vụ từ bộ đệm của trình duyệt.
aksu

14

Bạn phải lưu vị trí đó bằng cách nào đó.

Giả sử đó là dạng POST, chỉ cần đặt vị trí hiện tại vào một trường ẩn và sau đó sử dụng nó trong header()Vị trí.


14

Chỉ cần thêm một chút: Tôi tin rằng đây là một điều phổ biến và được biết đến exit;sau chức năng tiêu đề trong trường hợp chúng tôi không muốn phần còn lại của mã tải hoặc thực thi ...

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

Nó chỉ dành cho tôi.
Alexander Guo

2

Chỉ cần thử điều này trong Javascript:

 $previous = "javascript:history.go(-1)";

Hoặc bạn có thể thử nó trong PHP:

if(isset($_SERVER['HTTP_REFERER'])) {
    $previous = $_SERVER['HTTP_REFERER'];
}

1

Lưu trữ url trước đó trong một biến phiên là xấu, bởi vì người dùng có thể nhấp chuột phải vào nhiều trang và sau đó quay lại và lưu.

trừ khi bạn lưu url trước đó trong biến phiên vào trường ẩn trong biểu mẫu và sau khi lưu tiêu đề ("Vị trí: lưu URL của trang gọi");


tại sao chúng ta không thể sử dụng $ _SERVER ['http_Vferrer']?
Vignesh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.