Retour à la page précédente avec en-tête («Location:»); en PHP

124

Le titre de cette question explique en quelque sorte ma question. Comment rediriger le visiteur de la page PHP vers sa page précédente avec leheader( "Location: URL of previous page" );

Web_Designer
la source
header ('Location:'. $ _SERVER ['HTTP_REFERER']);
raskul
Selon cette source w3schools.com/php/php_superglobals_server.asp , ce n'est pas fiable car tous les fournisseurs ne le supportent pas
mohadennis

Réponses:

246

essayer:

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

Notez que cela peut ne pas fonctionner avec les pages sécurisées (HTTPS) et c'est une très mauvaise idée dans l'ensemble car l'en-tête peut être détourné, envoyant l'utilisateur vers une autre destination. L'en-tête peut même ne pas être envoyé par le navigateur.

Idéalement, vous voudrez soit:

  • Ajoutez l'adresse de retour à la requête en tant que variable de requête (par exemple? Back = / list)
  • Définissez une page de retour dans votre code (c'est-à-dire que toutes les soumissions de formulaire réussies sont redirigées vers la page de liste)
  • Fournir à l'utilisateur l'option de l'endroit où il souhaite aller ensuite (par exemple, enregistrer et continuer à modifier ou simplement enregistrer)
Dimitry
la source
19
Des choses étranges se sont produites :)
Dimitry
3
@Col pour que vous puissiez prouver un problème pratique avec cela?
Pekka
1
Utiliser le référent, après avoir testé au préalable s'il est défini et valide, dans un contexte de page à page défini peut être une pratique parfaitement acceptable - la grande majorité des navigateurs envoie un HTTP_REFERER approprié.
Pekka
1
@Col Je l'utilise en production quand je devais faire quelque chose pour une démo. Comme vous pouvez le voir dans ma réponse, je propose trois autres solutions vers lesquelles je me tournerais au lieu de la redirection basée sur HTTP_REFERER.
Dimitry
2
@Madmartigan qui ressemble à un comportement vraiment étrange, le seul indice que je peux voir sur le net est à l'origine de problèmes de redirection. Quoi qu'il en soit, je suis d'accord que l'utilisation du référent n'est pas la solution si vous avez besoin de 100% de sécurité
Pekka
22

C'est si simple, utilisez ceci

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

Ça marche bien pour moi

Hammad
la source
2
Cela semblait vraiment intelligent, mais dans FF10 je reçois "Corrupted Content Error The page you are trying to view cannot be shown because an error in the data transmission was detected."donc c'est fondamentalement inutilisable.
Wesley Murch
Wesley Murch, cela fonctionne très bien pour moi dans presque tous les principaux navigateurs, y compris celui que vous avez mentionné. Cela ne fonctionne que pour vous uniquement dans le cas où vous êtes venu sur la page ayant quelque chose dans l'histoire.
Hammad
5
Cela peut entraîner la diffusion de la page précédente à partir du cache du navigateur.
aksu le
14

Vous devez enregistrer cet emplacement d'une manière ou d'une autre.

Disons que c'est un formulaire POST, placez simplement l'emplacement actuel dans un champ masqué, puis utilisez-le dans l' header()emplacement.

Votre bon sens
la source
14

Juste un petit ajout: je pense que c'est une chose courante et connue à ajouter exit;après la fonction d'en-tête au cas où nous ne voudrions pas que le reste du code se charge ou s'exécute ...

header('Location: ' . $_SERVER['HTTP_REFERER']);
exit;
6opko
la source
C'est juste "" pour moi.
Alexander Guo
2

Essayez simplement ceci en Javascript:

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

Ou vous pouvez l'essayer en PHP:

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

Le stockage de l'URL précédente dans une variable de session est mauvais, car l'utilisateur peut faire un clic droit sur plusieurs pages, puis revenir et enregistrer.

sauf si vous enregistrez l'url précédente dans la variable de session dans un champ caché du formulaire et après enregistrer l'en-tête ("Emplacement: enregistrer l'URL de la page appelante");

Rudy
la source
pourquoi ne pouvons-nous pas simplement utiliser $ _SERVER ['http_referrer']?
Vignesh