Powrót do poprzedniej strony z nagłówkiem („Lokalizacja:”); w PHP


124

Tytuł tego pytania w pewnym sensie wyjaśnia moje pytanie. Jak przekierować odwiedzającego stronę PHP z powrotem do poprzedniej strony z rozszerzeniemheader( "Location: URL of previous page" );


nagłówek ('Lokalizacja:'. $ _SERVER ['HTTP_REFERER']);
raskul

Według tego źródła w3schools.com/php/php_superglobals_server.asp , nie jest to wiarygodne, ponieważ nie wszyscy dostawcy go obsługują
mohadennis

Odpowiedzi:


246

próbować:

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

Pamiętaj, że może to nie działać w przypadku bezpiecznych stron (HTTPS) i ogólnie jest to dość zły pomysł, ponieważ nagłówek może zostać przejęty, wysyłając użytkownika do innego miejsca docelowego. Przeglądarka może nawet nie wysłać nagłówka.

Idealnie byłoby, gdybyś:

  • Dołącz adres zwrotny do żądania jako zmienną zapytania (np.? Back = / list)
  • Zdefiniuj stronę zwrotną w swoim kodzie (tj. Wszystkie pomyślnie przesłane formularze przekierowują do strony z listą)
  • Zapewnij użytkownikowi opcję, gdzie chce przejść dalej (np. Zapisz i kontynuuj edycję lub po prostu Zapisz)

19
Dziwniejsze rzeczy się wydarzyły :)
Dimitry

3
@Col, więc możesz udowodnić praktyczny problem z tym?
Pekka,

1
Korzystanie z elementu odsyłającego, po uprzednim sprawdzeniu, czy jest on ustawiony i prawidłowy, w zdefiniowanym kontekście między stronami może być całkowicie akceptowalną praktyką - większość przeglądarek wysyła odpowiedni HTTP_REFERER.
Pekka

1
@Col Użyłem tego w produkcji, kiedy musiałem zrobić coś dla wersji demonstracyjnej. Jak widać z mojej odpowiedzi, podaję trzy inne rozwiązania, do których bym się zwrócił zamiast przekierowania opartego na HTTP_REFERER.
Dimitry

2
@Madmartigan, które brzmi jak naprawdę dziwne zachowanie, jedyną wskazówką, jaką widzę w sieci, powodującą problemy, są problemy z przekierowaniem. W każdym razie zgadzam się, że korzystanie z recenzenta nie jest drogą, jeśli potrzebujesz 100% bezpieczeństwa
Pekka

22

To takie proste, po prostu użyj tego

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

Dla mnie działa dobrze


2
Brzmiało to naprawdę sprytnie, ale w FF10 dostaję, "Corrupted Content Error The page you are trying to view cannot be shown because an error in the data transmission was detected."więc jest to w zasadzie bezużyteczne.
Wesley Murch

Wesley Murch, U mnie działa dobrze w prawie każdej większej przeglądarce, w tym tej, o której wspomniałeś. Działa tylko na wypadek, gdybyś wszedł na stronę, mając coś w historii.
Hammad

5
Może to spowodować, że poprzednia strona będzie obsługiwana z pamięci podręcznej przeglądarki.
aksu

14

Musisz jakoś zapisać tę lokalizację.

Powiedz, że jest to formularz POST, po prostu umieść bieżącą lokalizację w ukrytym polu, a następnie użyj jej w header()lokalizacji.


14

Tylko mały dodatek: uważam, że jest to powszechna i znana rzecz, którą dodaje się exit;po funkcji nagłówka na wypadek, gdybyśmy nie chcieli, aby reszta kodu była ładowana lub wykonywana ...

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

To jest po prostu "" dla mnie.
Alexander Guo

2

Przechowywanie poprzedniego adresu URL w zmiennej sesji jest złe, ponieważ użytkownik może kliknąć prawym przyciskiem myszy wiele stron, a następnie wrócić i zapisać.

chyba że zapiszesz poprzedni adres url w zmiennej sesji do ukrytego pola w formularzu i po zapisaniu nagłówka („Lokalizacja: zapisz URL strony wywołującej”);


dlaczego nie możemy po prostu użyć $ _SERVER ['http_referrer']?
Vignesh

2

Po prostu spróbuj tego w Javascript:

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

Lub możesz spróbować w PHP:

if(isset($_SERVER['HTTP_REFERER'])) {
    $previous = $_SERVER['HTTP_REFERER'];
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.