redireccionar - ¿Cómo hacer una redirección en PHP?
redireccionar php sin header (28)
¿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.
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()
yob_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
?>
¡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.
Como otros aquí dijeron, enviando el encabezado de ubicación con:
header( "Location: http://www.mywebsite.com/otherpage.php" );
pero debes hacerlo antes de enviar cualquier otra salida al navegador.
Además, si va a usar esto para bloquear usuarios no autenticados de ciertas páginas, como mencionó, tenga en cuenta que algunos agentes de usuarios thedailywtf.com/Articles/WellIntentioned-Destruction.aspx y continuarán en la página actual de todos modos, por lo que deberá morir ( ) después de enviarlo.
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;
La mejor manera de redireccionar con PHP es el siguiente código ...
header("Location: /index.php");
Asegúrese de que ningún código funcionará después de
header("Location: /index.php");
Todos los códigos deben ser ejecutados antes de la línea anterior.
Suponer,
Caso 1:
echo "I am a web developer";
header("Location: /index.php");
Se redirigirá correctamente a la ubicación (index.php).
Caso 2:
return $something;
header("Location: /index.php");
El código anterior no redireccionará a la ubicación (index.php).
Con suerte, está claro.
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();
?>
Podemos hacerlo de dos maneras.
- cuando el usuario entra en https://bskud.com/PINCODE/BIHAR/index.php , redirige a https://bskud.com/PINCODE/BIHAR.php
por debajo del código php
<?php header("Location: https://bskud.com/PINCODE/BIHAR.php"); exit; ?>
Guarde el código anterior en https://bskud.com/PINCODE/BIHAR/index.php
2. Cuando cualquier condición sea verdadera, entonces redirigir a otra página
<?php $myVar = "bskud"; if ($myVar == "bskud") { ?> <script> window.location.href="https://bskud.com"; </script> <?php } else { echo "<b>Check Website Name Again</b>"; } ?>
`
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.
Puede utilizar algunos métodos de script java como a continuación
1)self.location="http://www.example.com/index.php";
2)window.location.href="http://www.example.com/index.php";
3)document.location.href = ''http://www.example.com/index.php'';
4)window.location.replace("http://www.example.com/index.php");
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í, es posible usar PHP, redirigiremos a otra página, intente esto:
<?php
header("location:./");//redirect to index file
header("location:index.php");//redirect to index file
header("location:example.php");
?>
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).
Si está ejecutando en Apache, también puede usar .htaccess para redirigir.
Redirect 301 / http://new-site.com/
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:
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 - 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)
puedes actualizar el encabezado en php: header
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
$url = "targetpage"
Function redirect$url(){
If (headers_sent()) == false{
Echo ''<script>window.location.href="'' . $url . ''";</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()
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 ()!
header("Location: /index.php");
exit(0);