2009-08-10 11 views
5

Come posso reindirizzare in PHP con questa configurazione di seguito senza ottenere errori di output di intestazione, capisco che nulla può essere stampato sul browser prima che venga impostata un'intestazione, sto cercando una soluzione, non una spiegazione del perché accade per favore.Come posso reindirizzare in PHP senza errori di intestazione?

<?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(); 
    } 
} 
?> 

Vorrei funzione colpo di testa di php utente e non una meta o JavaScript

maintainning anche un elenco di pagine che richiedono dati di accesso o non è non è un'opzione qui se possibile

risposta

2

Non puoi semplicemente fare questo:

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

Oppure, inserire i file include in ogni uno dei "qualche-file-HERE" file -tipo, se è possibile, così si finisce 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

questo è quello che ho fatto, leggere la sezione di aggiornamento della mia domanda – JasonDavis

+0

scusa ho avuto un'altra domanda riguardante lo stesso problema, non mi ero accorto di essere su questo, comunque è il modo in cui ho finito per farlo earliar e ha funzionato abbastanza bene – JasonDavis

10

Usa ob_start() nella prima riga anche prima dell'inserimento. così puoi impostare le intestazioni in qualsiasi momento.

+0

ob_start() non risolvere questo problema, ma io odio usarlo, immagino ho bisogno di capire come funziona meglio, richiede l'intera pagina salvata in memoria invece di visualizzazione c orrect? – JasonDavis

+0

non direttamente. php utilizza un buffer di output in tutte le volte. ma funziona diversamente. il normale buffer può essere scaricato sul browser in qualsiasi momento. Usando outputbuffering ha solo uno svantaggio, non è possibile usare flush() questo è tutto. – Rufinus

0

Finché non si ha alcun output di script prima della funzione header(), si dovrebbe andare bene. Controlla che non ci siano echi o spazi vuoti. Anche mettere ob_start() all'inizio può aiutare. a volte c'è uno spazio bianco invisibile: cambiare il formato del documento in ANSI o Unicode può essere d'aiuto!

Come nota (anche se penso che tu già sappia) l'intestazione non termina lo script, quindi l'exit() (che hai) è un requisito preciso.

+0

c'è un output, nel mio esempio viene mostrato tutto il mio intero file di intestazione prima di sapere se sono su una pagina che deve essere loggata o no! – JasonDavis

+0

Sicuramente la funzione validlogin() dovrebbe essere chiamata prima che l'intestazione sia inclusa allora? – Meep3D

+0

non possibile come ho già detto, non tutte le pagine richiedono un login e le pagine sono costruite dinamicamente – JasonDavis

0

Il file footer.inc.php e SOME-FILE-HERE.php scrivono immediatamente nel flusso di risposta? Perché se così fosse, questo non funzionerà come avrai già scritto qualcosa prima di aver inviato le intestazioni.

+0

esattamente, ora capisci la domanda =) – JasonDavis

+0

ah, beh, che diventa più impegnativo :) C'è una funzione, e io non posso, per la vita di me ricordarlo, che costringe il processore a mettere in cache la risposta fino a dare il comando di inviare tutto, proverò a cercarlo perché potrebbe risolvere il tuo problema ... –

+0

jasondavis, la risposta di Gumbo è corretta anche se assicurati di chiamare ob_end_flush() alla fine dello script per inviare il flusso di risposta bufferizzato. Fondamentalmente, ob_start(); // tutto il codice incluso include ob_end_fush(); –

0

È necessario eseguire il buffer dell'output in modo che l'intestazione HTTP non venga inviata al primo output. È possibile bufferizzare qualsiasi uscita implicitamente abilitando ouput_buffering o esplicitamente chiamando ob_start. Ma quest'ultimo deve essere chiamato prima del primo output, quindi idealmente nella prima riga dello script che viene inizialmente chiamato.

0

Come già accennato dagli altri, utilizzare ob_start() o output_buffer, impostare il buffer dell'output. A parte questo, dal mio punto di vista non è una buona pratica pubblicare il contenuto nel mezzo del codice funzionale, ma questo è un altro argomento.

Puoi trovare ulteriori informazioni su Google o nello this Article about Output Buffering in PHP.

2

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

Problemi correlati