tiempo - ¿Cómo hacer una redirección en PHP?




redireccionar url (19)

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

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

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

2. Sin cabecera

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

Aquí no tendrá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
?>

https://code.i-harness.com

¿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 una actualización meta? ¿Posible?

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


¡La mayoría de estas respuestas están olvidando un paso muy importante!

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

Dejando esa segunda línea vital, podría terminar en thedailywtf.com/Articles/WellIntentioned-Destruction.aspx . El problema es que los navegadores no tienen que respetar los encabezados que devuelve su página, por lo que si se ignoran los encabezados, el resto de la página se ejecutará sin un redireccionamiento.


En la víspera de la web semántica, la corrección es algo a tener en cuenta. Desafortunadamente, el encabezado "Ubicación" de PHP todavía usa el código HTTP 302- redirect, que, estrictamente, no es el mejor para la redirección. El que debería usar en su lugar, es el 303 .

W3C es lo suficientemente amable como para mencionar que el encabezado 303 es incompatible con "muchos agentes de usuario pre-HTTP / 1.1", lo que no equivaldría a ningún navegador en el uso actual. Entonces, el 302 es una reliquia, que no debe usarse.

... o simplemente podrías ignorarlo, como todos los demás ...


Hay varias formas de hacer esto, pero si prefiere php , recomiendo el uso de la función header() .

Básicamente

$your_target_url = “www.example.com/index.php”;
header(“Location : $your_target_url”);
exit();

Si desea mejorarlo, es mejor usarlo en funciones; de esa manera, puede agregar autenticaciones y otros elementos de verificación en él.

Probemos comprobando el nivel del usuario.

Entonces, suponga que ha almacenado el nivel de autoridad del usuario en una sesión llamada u_auth .

En la function.php

<?php

function authRedirect($get_auth_level, $required_level, $if_fail_link = “www.example.com/index.php”){
    if($get_auth_level != $required_level){
        header(location : $if_fail_link);
        return false;
        exit();
    }else{
        return true;
    }
 }

 . . . 

Luego, llamará a la función para cada página que desee autenticar.

Como en page.php o en cualquier otra página.

<?php

// page.php

require “function.php”

authRedirect($_SESSION[‘u_auth’], 5);  // redirects to www.example.com/index.php if the user isn’t auth level 5
authRedirect($_SESSION[‘u_auth’], 4);  // redirects to www.example.com/index.php if the user isn’t auth level 4
authRedirect($_SESSION[‘u_auth’], 2, “www.someotherplace.com/somepage.php”);  // redirects to www.someotherplace.com/somepage.php if the user isn’t auth level 2


. . . 

Espero que encuentres algo de contenido útil.

Referencias;


Muchas de estas respuestas son correctas, pero suponen que tiene una URL absoluta, que puede no ser el caso. Si quieres usar una URL relativa y generar 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

Para redirigir al visitante a otra página (particularmente útil en un ciclo condicional), simplemente use el siguiente código:

<?php 
header('Location: mypage.php'); 
?>

En este caso, mypage.php es la dirección de la página a la que desea redirigir a los visitantes. Esta dirección puede ser absoluta y también puede incluir los parámetros en este formato: mypage.php?param1=val1¶m2=val2)

Camino relativo / absoluto

Cuando se trata de rutas relativas o absolutas, es ideal elegir una ruta absoluta desde la raíz del servidor (DOCUMENT_ROOT). Utilice el siguiente formato:

<?php 
header('Location: /directory/mypage.php'); 
?>

Si alguna vez la página de destino está en otro servidor, incluye la URL completa:

<?php 
header('Location: http://www.ccm.net/forum/'); 
?> 

Encabezados HTTP

Según el protocolo HTTP, los encabezados HTTP deben enviarse before cualquier tipo de contenido. Esto significa que nunca se deben enviar caracteres antes del encabezado, ¡ni siquiera un espacio vacío!

Redirecciones temporales / permanentes

Por defecto, el tipo de redirección presentado anteriormente es temporal. Esto significa que los motores de búsqueda, como Google, no tendrán en cuenta la redirección al indexar.

Si desea notificar a los motores de búsqueda que una página se ha movido permanentemente a otra ubicación, use el siguiente código:

<? 
header('Status: 301 Moved Permanently', false, 301); 
header('Location: new_address'); 
?>

Por ejemplo, esta página tiene el siguiente código:

<? 
header('Status: 301 Moved Permanently', false, 301); 
header('Location: /pc/imprimante.php3'); 
exit(); 
?>

Cuando hace clic en el enlace anterior, se le redirige automáticamente a esta página. Además, es una redirección permanente (Estado: 301 Movido permanentemente). Por lo tanto, si escribe la primera URL en Google, será redirigido automáticamente al segundo enlace redirigido.

Interpretación de código PHP

El código de PHP ubicado después del encabezado () será interpretado por el servidor, incluso si el visitante se mueve a la dirección especificada en la redirección. En la mayoría de los casos, esto significa que necesita un método para seguir la función header() función exit() para disminuir la carga del servidor:

<? 
header('Status: 301 Moved Permanently', false, 301); 
header('Location: address'); 
exit(); 
?>

Probablemente demasiado tarde para responder a esta. Sin embargo, aquí están mis pensamientos:

En mi humilde opinión, la mejor manera de redirigir una solicitud entrante sería mediante el uso de encabezados de ubicación, que van

<?php
header("Location: /index.php");
?>

Una vez que se ejecuta esta declaración y se envía la salida, el navegador comenzará a redirigir al usuario. Sin embargo, asegúrese de que no haya ninguna salida (ningún echo / var_dump) antes de enviar encabezados, de lo contrario, se producirán errores.

Aunque esta es una manera rápida y sucia de lograr lo que se solicitó originalmente, sin embargo, eventualmente resultaría ser un desastre de SEO, ya que este tipo de redirección siempre se interpreta como una redirección 301/302, por lo tanto, los motores de búsqueda siempre vea su página de índice como una página redirigida, y no una página de inicio / página principal. Por lo tanto, afectará a la configuración de SEO del sitio web.


Puede usar las variables de sesión para controlar el acceso a las páginas y autorizar también a los usuarios válidos.

<?php

session_start();

if ( !isset( $_SESSION["valid_user"]) )
{
    header("location:../");
   die();
}

// Page goes here
?>

http://php.net/manual/en/reserved.variables.session.php .

Recientemente, tuve ataques cibernéticos y decidí que necesitaba conocer a los usuarios que intentaban acceder al Panel de administración o a una parte reservada de la aplicación web.

Entonces, agregué una sesión de acceso IP y sesiones de usuario en un archivo de texto porque no quiero molestar a mi base de datos.


Puedes intentar usar la función de encabezado php para hacer la redirección. Querrá configurar el búfer de salida para que su navegador no arroje una advertencia de redireccionamiento a la pantalla.

ob_start();
header("Location: ".$website);
ob_end_flush();

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

1. respuesta básica

Puede usar la función header() para enviar un nuevo encabezado HTTP, pero debe enviarse al navegador antes de cualquier HTML o texto (así que antes de la declaración <!DOCTYPE ...> , por ejemplo).

header('Location: '.$newURL);

2. Detalles importantes

morir () o salir ()

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

Por qué debería usar die() o exit() : thedailywtf.com/Articles/WellIntentioned-Destruction.aspx

URL absoluta o relativa

Desde junio de 2014 se pueden utilizar URL absolutas y relativas. Consulte RFC 7231, que había reemplazado al anterior RFC 2616 , donde solo se permitían las URL absolutas.

Códigos de estado

El encabezado "Ubicación" de PHP todavía usa el código HTTP 302 -redirect, pero este no es el que debes usar. Debe considerar 301 (redirección permanente) o 303 (otros).

Nota: W3C menciona que el encabezado 303 es incompatible con "muchos agentes de usuario pre-HTTP / 1.1. Los navegadores utilizados actualmente 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 la función de header() 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 de ayuda

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() solo redirige el trabajo antes de que se escriba algo. Por lo general fallan si se invocan en la salida HTML . Entonces podrías usar una solución alternativa de encabezado HTML (¡no muy profesional!) Como:

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

O una redirección de JavaScript incluso.

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

Sí, puedes usar la función de header() ,

header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */
exit();

Y también la mejor práctica es llamar a la función exit() justo después de la función header() para evitar la ejecución del código a continuación.

De acuerdo con la documentación, se debe llamar a header() antes de enviar cualquier salida real.


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

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

Realmente no puede hacerlo en PHP a menos que almacene en búfer la salida de la página y luego verifique la condición de redireccionamiento. Eso podría ser demasiado complicado. Recuerde que los encabezados son lo primero que se envía desde la página. La mayor parte de la redirección generalmente se requiere más adelante en la página. Para eso, debe almacenar en la memoria intermedia toda la salida de la página y verificar la condición de redirección más adelante. En ese momento, puede redirigir el encabezado del usuario de la página () o simplemente hacer eco de la salida del búfer.

Para más información sobre el buffering (ventajas).

¿Qué es el búfer de salida?


Utilice la función header() para enviar el encabezado de la Location HTTP :

header('Location: '.$newURL);

Al contrario de lo que algunos piensan, die() no tiene nada que ver con la redirección. Úselo solo si desea redirigir en lugar de la 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:

[email protected]:~> 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 - die() / exit() obligatorio es una leyenda urbana, que no tiene nada que ver con el PHP real. No tiene nada que ver con el cliente "respetando" Location: encabezado. El encabezado de envío no detiene la ejecución de PHP, independientemente del cliente utilizado.


Ya he respondido a esta pregunta, pero lo haré de nuevo ya que, mientras tanto, he aprendido que hay casos especiales si se ejecuta en CLI (las redirecciones no pueden ocurrir y, por lo tanto, no deberían exit() ) o si su servidor web está ejecutando PHP como un (F) CGI (necesita un encabezado de Status configurado previamente para redirigir correctamente).

function Redirect($url, $code = 302)
{
    if (strncmp('cli', PHP_SAPI, 3) !== 0)
    {
        if (headers_sent() !== true)
        {
            if (strlen(session_id()) > 0) // if using sessions
            {
                session_regenerate_id(true); // avoids session fixation attacks
                session_write_close(); // avoids having sessions lock other requests
            }

            if (strncmp('cgi', PHP_SAPI, 3) === 0)
            {
                header(sprintf('Status: %03u', $code), true, $code);
            }

            header('Location: ' . $url, true, (preg_match('~^30[1237]$~', $code) > 0) ? $code : 302);
        }

        exit();
    }
}

También manejé el problema de admitir los diferentes códigos de redireccionamiento HTTP ( 301 , 302 , 303 y 307 ), tal como se abordó en los comentarios de mi respuesta anterior, aquí están las descripciones:

  • 301 - Movido permanentemente
  • 302 - Encontrado
  • 303 - Ver otros
  • 307 - Redireccionamiento temporal (HTTP / 1.1)

header( 'Location: http://www.yoursite.com/new_page.html' );


1. Usando el encabezado en la función php

a) Redireccionamiento simple sin parámetros.

<?php

   header('Location: index.php');

?>

b) Redireccionar con parámetros GET

<?php

      $id = 2;

      header("Location: index.php?id=$id&msg=succesfully redirect");

  ?>

2. Redirigir con javascript en php

a) Redireccionamiento simple sin parámetros.

<?php 

     echo "<script>location.href='index.php';</script>";

 ?>

b) Redireccionar con parámetros GET

<?php 

     $id = 2;

     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";

   ?>

<?php 
header('Location: redirectpage.php');
header('Location: redirectpage.php');exit();
echo "<script>location.href='redirectpage.php';</script>";
?>

Esto es un redireccionamiento de PHP normal y normal, pero puede redireccionar una página con un código de espera a los pocos segundos:

<?php
header('refresh:5;url=redirectpage.php '); //Note: here 5 means 5 seconds wait for redirect.
?>

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

o si ya has abierto las etiquetas php, usa 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()


header("Location: /index.php");
exit(0);   




redirect