Zurück zur vorherigen Seite mit Kopfzeile ("Ort:"); in PHP

124

Der Titel dieser Frage erklärt meine Frage. Wie leite ich den PHP-Seitenbesucher mit dem auf die vorherige Seite zurück?header( "Location: URL of previous page" );

Webdesigner
quelle
Header ('Location:'. $ _SERVER ['HTTP_REFERER']);
Raskul
Laut dieser Quelle ist w3schools.com/php/php_superglobals_server.asp nicht zuverlässig, da nicht alle Anbieter dies unterstützen
mohadennis

Antworten:

246

Versuchen:

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

Beachten Sie, dass dies möglicherweise nicht mit sicheren Seiten (HTTPS) funktioniert und insgesamt eine ziemlich schlechte Idee ist, da der Header entführt werden kann und der Benutzer an ein anderes Ziel gesendet wird. Der Header wird möglicherweise nicht einmal vom Browser gesendet.

Idealerweise möchten Sie entweder:

  • Hängen Sie die Absenderadresse als Abfragevariable an die Anforderung an (z. B.? Back = / list).
  • Definieren Sie eine Rückgabeseite in Ihrem Code (dh alle erfolgreichen Formularübermittlungen werden auf die Listenseite umgeleitet).
  • Geben Sie dem Benutzer die Option, wohin er als Nächstes gehen möchte (z. B. Speichern und weiter bearbeiten oder einfach speichern).
Dimitry
quelle
19
Es sind seltsamere Dinge passiert :)
Dimitry
3
@Col, damit Sie ein praktisches Problem damit beweisen können?
Pekka
1
Die Verwendung des Referers in einem definierten Kontext von Seite zu Seite kann nach vorherigem Testen, ob er festgelegt und gültig ist, durchaus akzeptabel sein - die überwiegende Mehrheit der Browser sendet einen ordnungsgemäßen HTTP_REFERER mit.
Pekka
1
@Col Ich habe dies in der Produktion verwendet, als ich etwas für eine Demo erledigen musste. Wie Sie meiner Antwort entnehmen können, biete ich anstelle der auf HTTP_REFERER basierenden Umleitung drei weitere Lösungen an, an die ich mich wenden würde.
Dimitry
2
@Madmartigan, das klingt nach wirklich seltsamem Verhalten. Der einzige Hinweis, den ich im Internet sehen kann, der es verursacht, sind einige Umleitungsprobleme. Wie auch immer, ich stimme zu, dass die Verwendung des Referers nicht der richtige Weg ist, wenn Sie 100% ige Sicherheit benötigen
Pekka
22

Es ist so einfach, benutze dies einfach

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

Es funktioniert gut für mich

Hammad
quelle
2
Das klang wirklich klug, aber in FF10 verstehe ich "Corrupted Content Error The page you are trying to view cannot be shown because an error in the data transmission was detected."Das ist also im Grunde unbrauchbar.
Wesley Murch
Wesley Murch, es funktioniert gut für mich in fast allen wichtigen Browsern, einschließlich dem, den Sie erwähnt haben. Es funktioniert nur für Sie, wenn Sie auf die Seite gekommen sind, die etwas in der Geschichte hat.
Hammad
5
Dies kann dazu führen, dass die vorherige Seite aus dem Browser-Cache bereitgestellt wird.
Aksu
14

Sie müssen diesen Ort irgendwie speichern.

Angenommen, es handelt sich um ein POST-Formular. Geben Sie einfach den aktuellen Speicherort in ein ausgeblendetes Feld ein und verwenden Sie ihn dann im Speicherort header().

Ihr gesunder Menschenverstand
quelle
14

Nur eine kleine Ergänzung: Ich glaube, es ist eine übliche und bekannte Sache, exit;nach der Header-Funktion hinzuzufügen, falls wir nicht möchten, dass der Rest des Codes geladen oder ausgeführt wird ...

header('Location: ' . $_SERVER['HTTP_REFERER']);
exit;
6opko
quelle
Es ist nur "" für mich.
Alexander Guo
2

Versuchen Sie dies einfach in Javascript:

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

Oder Sie können es in PHP versuchen:

if(isset($_SERVER['HTTP_REFERER'])) {
    $previous = $_SERVER['HTTP_REFERER'];
}
Minu Alex
quelle
1

Das Speichern der vorherigen URL in einer Sitzungsvariablen ist fehlerhaft, da der Benutzer möglicherweise mit der rechten Maustaste auf mehrere Seiten klickt und dann zurückkommt und speichert.

es sei denn, Sie speichern die vorherige URL in der Sitzungsvariablen in einem ausgeblendeten Feld im Formular und nach dem Speichern des Headers ("Speicherort: URL der aufrufenden Seite speichern");

rudy
quelle
Warum können wir nicht einfach $ _SERVER ['http_referrer'] verwenden?
Vignesh