Volver a la página anterior con encabezado ("Ubicación:"); en PHP

124

El título de esta pregunta explica mi pregunta. ¿Cómo redirijo al visitante de la página PHP a su página anterior con elheader( "Location: URL of previous page" );

Diseñador web
fuente
header ('Ubicación:'. $ _SERVER ['HTTP_REFERER']);
raskul
Según esta fuente w3schools.com/php/php_superglobals_server.asp , no es confiable porque no todos los proveedores lo admiten
mohadennis

Respuestas:

246

tratar:

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

Tenga en cuenta que esto puede no funcionar con páginas seguras (HTTPS) y es una idea bastante mala en general, ya que el encabezado puede ser secuestrado, enviando al usuario a otro destino. El encabezado ni siquiera puede ser enviado por el navegador.

Idealmente, querrá:

  • Agregue la dirección de retorno a la solicitud como una variable de consulta (por ejemplo,? Back = / list)
  • Defina una página de retorno en su código (es decir, todos los envíos de formularios exitosos redirigen a la página de listado)
  • Proporcione al usuario la opción de a dónde quiere ir a continuación (por ejemplo, Guardar y continuar editando o simplemente Guardar)
Dimitry
fuente
19
Cosas más extrañas han sucedido :)
Dimitry
3
@Col para que puedas probar un problema práctico con esto?
Pekka
1
Usar el árbitro, después de probar previamente si está configurado y es válido, en un contexto definido de página a página puede ser una práctica perfectamente aceptable: la gran mayoría de los navegadores envía un HTTP_REFERER adecuado.
Pekka
1
@Col. Utilicé esto en producción cuando tuve que hacer algo para una demostración. Como puede ver en mi respuesta, proporciono otras tres soluciones a las que recurriría en lugar de la redirección basada en HTTP_REFERER.
Dimitry
2
@Madmartigan que suena como un comportamiento realmente extraño, la única pista que puedo ver en la red es que hay algunos problemas de redireccionamiento. De todos modos, estoy de acuerdo en que usar el árbitro no es el camino si necesitas 100% de seguridad
Pekka
22

Es tan simple, solo usa esto

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

Esta trabajando bien para mi

Hammad
fuente
2
Esto sonaba muy inteligente, pero en FF10 entiendo. "Corrupted Content Error The page you are trying to view cannot be shown because an error in the data transmission was detected."Esto es básicamente inutilizable.
Wesley Murch
Wesley Murch, funciona bien para mí en casi todos los principales navegadores, incluido el que has mencionado. Solo funciona para ti en caso de que llegues a la página con algo en la historia.
Hammad
55
Esto puede hacer que la página anterior se sirva desde la memoria caché del navegador.
aksu
14

Tienes que guardar esa ubicación de alguna manera.

Digamos que es un formulario POST, simplemente coloque la ubicación actual en un campo oculto y luego úselo en la header()Ubicación.

Su sentido común
fuente
14

Solo una pequeña adición: creo que es algo común y conocido agregar exit;después de la función de encabezado en caso de que no queramos que el resto del código se cargue o ejecute ...

header('Location: ' . $_SERVER['HTTP_REFERER']);
exit;
6opko
fuente
Es solo para mi.
Alexander Guo
2

Solo intenta esto en Javascript:

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

O puedes probarlo en PHP:

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

Almacenar la URL anterior en una variable de sesión es malo, porque el usuario puede hacer clic derecho en varias páginas y luego volver y guardar.

a menos que guarde la URL anterior en la variable de sesión en un campo oculto en el formulario y después de guardar el encabezado ("Ubicación: guardar URL de la página de llamada");

Rudy
fuente
¿por qué no podemos usar el $ _SERVER ['http_referrer']?
Vignesh