2009-08-10 7 views
5

¿Cómo puedo redireccionar en PHP con esta configuración a continuación sin obtener errores de salida del encabezado, entiendo que no se puede imprimir nada en el navegador antes de establecer un encabezado, estoy buscando una solución, no una explicación de por qué sucede, por favor.¿Cómo puedo redireccionar en PHP sin errores de encabezado?

<?PHP 
// include header 
include ('header.inc.php'); 



// In my body section file if this is a page that requires a user be logged in then 
// I run a function validlogin($url-of-page-we-are-on); inside of that file 
//the function is below, it outputs a redirect to login page if not logged in 

// include body of page we want 
include ('SOME-FILE-HERE.php'); 



// include footer 
include ('footer.inc.php'); 



// here is the function that is in the body pages, it is only called on a page that we require a logged in user so there are hundreds of pages that do have this and a bunch that don't, it's on a page to page basis 
function validlogin($url) { 
    if ($_SESSION['auto_id'] == '') { 
     $msg = 'Please login'; 
     $_SESSION['sess_login_msg'] = $msg; 
     $_SESSION['backurl'] = $url; 
     $temp = ''; 
     header("Location: /"); 
     exit(); 
    } 
} 
?> 

quisiera función de cabecera de php usuario y no un meta o JavaScript

también maintainning una lista de páginas que requieren iniciar sesión o no no es una opción aquí si es posible

Respuesta

2

¿No puedes hacer esto:

<?php 
validlogin($url); // call the function here 
include ('header.inc.php'); 
include ('SOME-FILE-HERE.php'); 
include ('footer.inc.php'); 
?> 

O, dicho de los archivos de inclusión en cada una de las "Algunos-file-HERE" archivos de tipo, si eso es posible, por lo que terminan con :

<?php 
validlogin($url); // call the function here 
include ('header.inc.php'); 
?> 

<h1>Page heading</h1> 
...page content etc... 

<?php 
include ('footer.inc.php'); 
?> 
+0

eso es lo que hice, lea la sección de actualización de mi pregunta – JasonDavis

+0

lo siento II tenía otra pregunta con respecto al mismo problema, no me di cuenta de que estaba en este, de todos modos esa fue la forma en que terminé haciéndolo antes y funcionó bastante bien – JasonDavis

10

Uso ob_start() en la primera línea incluso antes de incluir. para que pueda establecer encabezados en cualquier momento.

+0

ob_start() resuelve este problema pero no me gusta usarlo, supongo que tengo que entender cómo funciona mejor, se requiere toda la página se guarda en la memoria en lugar de simplemente mostrar es c orrect? – JasonDavis

+0

no directamente. php usa un buffer de salida todo el tiempo. pero funciona de manera diferente. el buffer normal puede ser lavado al navegador en cualquier momento. Usar el buffer de salida tiene solo un inconveniente, no puede usar flush() eso es todo. – Rufinus

0

Mientras no tenga salida de script antes de la función de encabezado(), debería estar bien. Verifique que no haya ecos o espacios en blanco. También poner ob_start() al principio puede ayudar. a veces hay espacios en blanco invisibles: ¡cambiar el formato de su documento a ANSI o Unicode puede ayudar!

Como una nota (aunque creo que ya lo sabe), el encabezado no termina el script, por lo que la salida() (que tiene) es un requisito definitivo.

+0

hay salida IS, en mi ejemplo, se emite todo el archivo de encabezado completo antes de saber si estoy en una página que debe estar o no conectada. – JasonDavis

+0

Seguramente, la función valid login() debería llamarse antes de que se incluya el encabezado, entonces? – Meep3D

+0

no es posible, como también lo mencioné, no todas las páginas requieren un inicio de sesión y las páginas están construidas dinámicamente – JasonDavis

0

¿El footer.inc.php y SOME-FILE-HERE.php escriben inmediatamente en el flujo de respuesta? Porque si es así, esto no funcionará ya que ya habrá escrito algo antes de enviar los encabezados.

+0

exactamente, ahora usted entiende la pregunta =) – JasonDavis

+0

ah, bueno, eso se vuelve más desafiante :) Hay una función, y yo No puedo, por mi vida recordarlo, que obliga al procesador a almacenar en caché la respuesta hasta que le dé el comando para enviarlo todo, intentaré buscarlo, porque eso podría resolver su problema ... –

+0

jasondavis, la respuesta de Gumbo es correcta, aunque asegúrese de llamar a ob_end_flush() al final de la secuencia de comandos para enviar la secuencia de respuesta almacenada. Básicamente, ob_start(); // todo su código incluyendo cualquiera incluye ob_end_fush(); –

0

Debe almacenar en búfer la salida para que el encabezado HTTP no se envíe en la primera salida. Puede búfer cualquier salida implícitamente habilitando ouput_buffering o explícitamente llamando al ob_start. Pero este último tiene que ser llamado antes de la primera salida, por lo que idealmente se llama en la primera línea del guión.

0

Como ya se mencionó por los otros, use ob_start() o output_buffer-ajuste para almacenar la salida. Aparte de eso, desde mi punto de vista, no es una buena práctica publicar contenido en el medio del código funcional, pero este es otro tema.

Puede encontrar más información en Google o en this Article about Output Buffering in PHP.

2

uso { echo '<META HTTP-EQUIV="Refresh" Content="0; URL=process.php">';}

Cuestiones relacionadas