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" );

Projektant stron internetowych
źródło
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)
Dimitry
źródło
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

Hammad
źródło
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.

Twój zdrowy rozsądek
źródło
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;
6opko
źródło
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”);

rudy
źródło
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'];
}
Minu Alex
źródło