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:
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
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:
Laddove vogliamo che avvenga il tutto!
Sempre più modniubbone?
Eh, magari, non c’ho il tempo nemmeno per grattarmi la panza in questo periodo
Grazie per questo articolo…
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…
@ Expo: perchè non potrei assegnare una variabile con valore numerico?
Basta scrivere:
$tempo = 15;
Ed il redirect parte dopo 15 secondi.
Fra l’altro se vuoi una funziona un po’ più ottimizzata, leggi qui: http://www.davidonzo.com/dblog/articolo.asp?articolo=368
grazie, davvero molto utile!
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
Ciao Roberto,
Colpa mia. Corretto nel post:
echo "<meta http-equiv="refresh" content="" . $tempo . ";" . $url . "">";
Questo funziona.
sarò idiota
ma dove si inserisce l'url di destinazione nel codice?
grazie
Ti ridireziona a google.it dopo 5 secondi.
PS: idiota è chi non si pone domande pensando di avere tutte le risposte 😉
ma se l'utente disabilita meta redirect come si fa?
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 🙂
ciao,
perchè usi meta http-equiv che è principalmente html, se puoi usare header con refresh come hai fatto nella riga precedente?
buona programmazione 🙂
superstatistic.it/redir.php
non ti fa entrare in superstatistic, che vuol dire
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?
Grazie! 🙂
Funziona!! grazie 1000!!
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
Questo post mi è stato molto utile.
Ti ringrazio!
Mario
PcApposto assistenza compurer
Era quello che cercavo. Ottimi esempi!