PHP – Un facile redirect

E’ da un po’ che non scrivevo nel blog : - ) . Dai che ho pure tante storielle da raccontarvi. Tassisti abusivi con il vezzo di guidare sul marciapiede, fornitori folli con stravaganti idee del descrivere il proprio lavoro. Ma tutto questo lo leggerete prossimamente, perchè ora il blog mi serve da segnalibro ; - ) .

Ho perfezionato una semplice funzioncina di redirect, utilizzabile in qualsiasi applicazione PHP. Il problema principale che si ha in questi casi è stare attenti al che la pagina che reindirizza, non abbia ricevuto altri header. Ovverto altre intestazioni, altro conenuto…
Questo perchè il redirect in PHP è fatto tramite una funzione molto semplice, che permette di inviare un’intestazione particolare, che reindirizza ad altra pagina.

La funzione di redirect in PHP è di base molto semplice. Quando decidiamo di inviare il browser ad altra destinazione eseguiamo il comando:

//Per reindirizzare ad un sito esterno
header( "Location: http://www.sitodiarrivo.it" );

//Per reindirizzare ad una pagina diversa dello stesso sito

//Ed in questo esempio, contenuta nella stessa directory
header( "Location: pagina.php" );

Tutto ciò funzionerà se al momento dell’esecuzione del comando, la pagina non ha ricevuto altri header. In caso contrario ci verrà restituito il noioso errore: "Cannot modify header information – headers already sent by…", seguito dal nome del file e dal numero di riga in cui è stato inviato il precedente input di header.

Per controllare se altri header sono stati inviati, ci viene in soccorso lo stesso PHP, con la funzione headers_sent(). Questa restituisce un booleano con valore TRUE se gli header sono stati inviati, FALSE in caso contrario.

Ma c’è anche un’altra cosa da tenere in considerazione. Con la funzione header( "Location: $url" ) sopra vista, il redirect è immediato. Spesso invece si vuole reindirizzare dopo un tot di secondi, di modo tale che l’utente visualizzi ed abbia il tempo di leggere un avviso di redirezionamento.

Per fare il tutto e scegliere se ridirezionare direttamente o dopo qualche secondo, senza preoccuparsi che altri header siano stati inviati, basta una piccola funzioncina : - )

function redirect($url,$tempo = FALSE ){
 if(!headers_sent() && $tempo == FALSE ){
  header(‘Location:’ . $url);
 }elseif(!headers_sent() && $tempo != FALSE ){
  header(‘Refresh:’ . $tempo . ‘;’ . $url);
 }else{
  if($tempo == FALSE ){
    $tempo = 0;
  }
  echo "<meta http-equiv=\"refresh\" content=\"" . $tempo . ";" . $url . "\">";
  }
}

Commentiamola un po’!

Ho una funzione con due parametri: l’url a cui ridirezionare che è parametro necessario, e il tempo di attesa prima del redirect che può essere anche omesso (ovvero essere FALSE ).

Se non sono stati inviati altri header e se voglio un redirect diretto, allora uso la funzione più semplice ed immediata : - ) : header associata al parametrio "Location".

Se non sono stati inviati altri header e voglio qualche secondo di attesa prima del redirect, allora userò sempre la funzione header, ma associata al parametro "Refresh", a cui posso dare un tempo di attesa prima dell’esecuzione.

Se sono stati mandati altri header, allora userò il redirect in HTML, facendo attenzione ad una cosa. Il comando HTML vuole il parametro tempo definito, per cui se io non l’ho stabilito, questo si setterà automaticamente a 0.

Utilizzare la funzione è molto semplice: basta richiamarla con un:

redirect(‘indirizzo’,secondi);

Laddove vogliamo che avvenga il tutto!

20 thoughts on “PHP – Un facile redirect”

  1. Scusa ma come fai ad inserire una variabile $tempo? Dovresti sapere che non puoi assegnare numeri a variabili, ne tantomeno sostituire la variabile con il numero dei secondi… E cmq questa funzione non l’avevo mai sentita…

  2. Ho inserito il tuo codice in una piccola applicazione, ma in fase di caricamento della pagina mi dà questo errore:

    Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in /var/www/tasks/task_new.php on line 19

    La riga incriminta è l'ultima:

    echo "<meta http-equiv="refresh" content="" . $tempo . ";url=" . $url . "">";

    manca qualcosa ?

    Grazie

  3. Ciao Roberto,

    Colpa mia. Corretto nel post:

    echo "<meta http-equiv="refresh" content="" . $tempo . ";" . $url . "">";

    Questo funziona.

  4. redirect('http://www.google.it', 5);

    Ti ridireziona a google.it dopo 5 secondi.

    PS: idiota è chi non si pone domande pensando di avere tutte le risposte 😉

  5. ma la direttiva url te la sei dimenticata apposta per vedere se gli alunni stanno attenti?

    content="" . $tempo . ";" . $url

    va corretto in

    content="" . $tempo . ";url=" . $url

    altrimenti non funziona 🙂

  6. ciao,

    perchè usi meta http-equiv che è principalmente html, se puoi usare header con refresh come hai fatto nella riga precedente?

    buona programmazione 🙂

  7. D'accordo, è un po' vecchiotto e forse non ti aspettavi di essere rotto le scatole dopo tanto tempo; però, me lo trovavo ed ha funzionato subito in local … ma sul server, nulla!
    Non fa il redirect e non dà messaggi d'errore nemmeno se i campi sono vuoti!
    Com'è possibile?

  8. Grazie mille! ottima funzione!!!

    ma perchè funziona solo con safari e mozilla e non con i.e.???

    Ho queste versioni
    safari 5.1.2
    mozilla 9.0.1
    i.e. 8.0.7601.17514

Comments are closed.