Pregunta ¿Cómo hacer una redirección en PHP?


¿Es posible redirigir a un usuario a una página diferente mediante el uso de PHP?

Digamos que el usuario va a www.example.com/page.php y quiero redirigirlos a www.example.com/index.php, ¿cómo lo haría sin el uso de un meta refresh? ¿Posible?

Esto podría incluso proteger mis páginas de usuarios no autorizados.


983
2018-04-20 14:13


origen


Respuestas:


Resumen de las respuestas existentes más mis propios dos centavos:

1. Respuesta básica

Puedes usar el header() función para enviar un nuevo encabezado HTTP, pero esto debe enviarse al navegador antes de cualquier HTML o texto (por lo tanto, antes de la <!DOCTYPE ...> declaración, por ejemplo).

header('Location: '.$newURL);

2. Detalles importantes

morir() o salida()

header("Location: http://example.com/myOtherPage.php");
die();

Por qué deberías usar die() o exit(): The Daily WTF

URL absoluta

La URL debe ser absoluta. Ver RFC 2616. Pero en la mayoría de los casos también se aceptará una URL relativa.

Códigos de estado

La cabecera "Ubicación" de PHP todavía usa el HTTP 302-código directo, pero este no es el que deberías usar. Deberías considerar cualquiera 301 (redirección permanente) o 303 (otro).

Nota: W3C menciona que el encabezado 303 es incompatible con "muchos agentes de usuario anteriores a HTTP / 1.1. Los navegadores actualmente utilizados son todos agentes de usuario HTTP / 1.1. Esto no es cierto para muchos otros agentes de usuario como arañas y robots.

3. Documentación

Encabezados HTTP y el header() función en PHP

4. Alternativas

Puede usar el método alternativo de http_redirect($url); que necesita el Paquete PECL pecl Para ser instalado.

5. Funciones auxiliares

Esta función no incorpora el código de estado 303:

function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

Redirect('http://example.com/', false);

Esto es más flexible:

function redirect($url, $statusCode = 303)
{
   header('Location: ' . $url, true, $statusCode);
   die();
}

6. Solución

Como se mencionó header() redirige solo el trabajo antes de que se escriba algo. Por lo general, fallan si invocado inmidst HTML salida. Luego, puede usar una solución de encabezado HTML (¡no muy profesional!) Como:

 <meta http-equiv="refresh" content="0;url=finalpage.html">

O un redireccionamiento de JavaScript incluso.

window.location.replace("http://example.com/");

1402
2018-04-20 14:19



function Redirect($url, $permanent = false)
{
    if (headers_sent() === false)
    {
        header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
    }

    exit();
}

Redirect('http://www.google.com/', false);

¡No te olvides de morir () / salir ()!


89
2018-06-27 07:24



Salida JavaScript desde PHP usando echo, que hará el trabajo.

echo '<script type="text/javascript">
           window.location = "http://www.google.com/"
      </script>';

En realidad no puedes hacerlo en PHP a menos que guardes el buffer de la salida de la página y luego verifiques la condición de redireccionamiento. Eso podría ser una molestia. Recuerde que los encabezados son lo primero que se envía desde la página. La mayoría de los redireccionamientos generalmente se requieren más adelante en la página. Para eso tienes que almacenar todo el resultado de la página y verificar la condición de redireccionamiento más tarde. En ese punto, puede redirigir el encabezado del usuario de la página () o simplemente hacer eco de la salida almacenada en el búfer.

Para obtener más información sobre el almacenamiento en búfer (ventajas)

¿Qué es el buffer de salida?


86
2018-04-20 14:14



Utilizar header() función mandar HTTP Location encabezamiento:

header('Location: '.$newURL);

Al contrario de lo que algunos piensan, die() no tiene nada que ver con la redirección. Úselo solamente si quieres redirigir en lugar de ejecución normal.

example.php:

<?php 
header('Location: static.html');
$fh = fopen('/tmp/track.txt','a');
fwrite($fh, $_SERVER['REMOTE_ADDR'].' '.date('c')."\n");
fclose($fh);
?>

Resultado o 3 ejecuciones:

bart@hal9k:~> cat /tmp/track.txt
127.0.0.1 2009-04-21T09:50:02+02:00
127.0.0.1 2009-04-21T09:50:05+02:00
127.0.0.1 2009-04-21T09:50:08+02:00

Reanudar - obligatorio die()/exit() es una leyenda urbana, que no tiene nada que ver con PHP real. No tiene nada que ver con que el cliente "respete" Location: encabezamiento. El envío de encabezado no detiene la ejecución de PHP, independientemente del cliente utilizado.


79
2018-04-13 12:44



1. Usando la función de encabezado con exit()

<?php 
     header('Location: target-page.php');
     exit();
?>

pero si usa la función de encabezado, algunas veces obtendrá "advertencia  como encabezado ya enviar " para resolver que no se repita o imprima antes de enviar encabezados o simplemente puede usar die() o exit() después de la función de encabezado.

2. Sin encabezado

<?php 
    echo "<script>location.href='target-page.php';</script>";
?>

aquí no enfrentarás ningún problema

3. Usando la función de encabezado con ob_start() y ob_end_flush()

<?php
ob_start(); //this should be first line of your page
header('Location: target-page.php');
ob_end_flush(); //this should be last line of your page
?>

57
2018-04-20 14:24



La mayoría de estas respuestas son olvidar una muy paso importante!

header("Location: myOtherPage.php");
die();

Dejar esa segunda línea vital podría hacer que termines en The Daily WTF. El problema es que los navegadores no tener para respetar los encabezados que devuelve su página, por lo que, al ignorar los encabezados, el resto de la página se ejecutará sin una redirección.


49
2018-05-16 13:12



<?php header('Location: another-php-file.php'); exit(); ?>

o si ya ha abierto las etiquetas php, use esto:

header('Location: another-php-file.php'); exit();

También puede redirigir a páginas externas, por ejemplo:

header('Location: https://www.google.com'); exit();

Asegúrate de incluir exit() o include die()


23
2018-01-15 04:21



Muchas de estas respuestas son correctas, pero suponen que tiene una URL absoluta, que puede no ser el caso. Si quieres usar un URL relativa y genera el resto, entonces puedes hacer algo como esto ...

$url = 'http://' . $_SERVER['HTTP_HOST'];            // Get the server
$url .= rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); // Get the current directory
$url .= '/your-relative/path-goes/here/';            // <-- Your relative path
header('Location: ' . $url, true, 302);              // Use either 301 or 302

18
2017-09-09 10:48