Per fare un redirect PHP รจ necessario utilizzare la funzione header(). Grazie a questa funzione nativa del PHP, mediante la quale possiamo inviare intestazioni HTTP al client che sta visitando la nostra pagina web, รจ possibile impostare una nuova location verso la quale reindirizzare la navigazione dellโutente, in poche parole possiamo far โrimbalzareโ lโutente portandolo su unโaltra pagina del nostro o di un altro sito.
Indice
Come fare un redirect con PHP
Per prima cosa vediamo un semplice esempio di utilizzo della funzione header() di PHP per effettuare un redirect automatico dellโutente verso una diversa pagina del sito o di un sito differente:
// redirect verso pagina interna
header("location: /nuova-pagina.php");
// redirect verso una risorsa esterna al sito
header("location: http://www.sito.it/pagina.php");
Eโ importante ricordare che lโutilizzo di questo codice deve essere fatto prima di aver generato alcun output. In caso contrario lโinterprete PHP restituirร un errore invece di realizzare il redirect desiderato. Segue un esempio di codice errato:
echo "Stampo un po' di output";
header("location: http://www.sito.it/pagina.php");
// !!! ERRORE !!!
// non puoi inviare degli header dopo aver stampato a video!!!
Unโaltra accortezza alla quale รจ bene prestare attenzione consiste nellโaver cura di inserire un exit dopo lโutilizzo di questa funzione qualora, allโinterno del nostro script, vi sia altro codice da eseguire dopo quello che realizza il redirect. Ad esempio:
if ($utente_loggato == false) {
header("location: http://www.sito.it/pagina.php");
exit;
}
// ... segue altro codice PHP ...
Grazie ad exit, infatti, lโinterprete PHP interrompe lโesecuzione del codice della pagina non appena inviate le intestazioni HTTP attraverso le quali prenderร il via il redirezionamento dellโutente.
Redirect e motori di ricerca
Diversamente da un redirect realizzato con Javascript, รจ bene precisare che un redirect PHP, operando attraverso lโinvio di intestazioni standard HTTP, produce i suoi effetti non solo nei riguardi degli utenti del sito ma anche verso gli spider. Ne consegue che puรฒ rivelarsi piuttosto importante inviare, subito prima della nuova location, uno stato HTTP che informi lo spider circa la natura del trasferimento.
Normalmente un redirect รจ preceduto dallโinvio di uno stato 3XX. Il piรน comune รจ il 302 che indica uno โspostamento temporaneoโ della risorsa presso unโaltra URL. In questo caso il motore di ricerca โsegueโ il redirect ma non aggiorna il suo archivio in quanto la pagina originale รจ solo temporaneamente redirezionata (questo, almeno, รจ quello che gli dice lo stato 302).
Se lo scopo del nostro redirect รจ quello di indicare la nuova URL di una risorsa (ad esempio perchรจ un contenuto รจ stato spostato su una nuova pagina del sito) sarร necessario utilizzare lo status 301 Moved Permanently.
Redirect 301 con PHP
Per effettuare un redirect permanente (redirect con status 301) รจ necessario utilizzare due volte la funzione header() di PHP: la prima per impostare lo status HTTP 301 e la seconda per eseguire il reindirizzamento:
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.nuovosito.com');
Dal punto di vista dellโutente umano il primo header non produce nessun effetto tangibile sul redirect, per gli spider, tuttavia, assume unโimportanza vitale in quanto informa il motore di ricerca del cambiamento avvenuto nel sito. A questo punto il motore di ricerca aggiornerร il suo indice sostituendo la vecchia URL con la nuova la quale manterrร il rank originario nonchรฉ lโapporto di link eventualmente guadagnato nel tempo.
Lo stesso risultato puรฒ essere raggiunto anche son una singola linea di codice PHP:
header('Location: http://www.nuovosito.com', true, 301);
Con questa sintassi il codice di stato HTTP รจ passato come terzo parametro della funzione header().
Gestire i redirect PHP con una funzione ad hoc
Di seguito una interessante funzione PHP che potete utilizzare nei vostri progetti per gestire i redirect.
La funzione accetta due parametri:
- location: la URL di atterraggio;
- status: lo stato HTTP del redirect.
Di seguito il codice della funzione:
function redirect($location, $status=302) {
if (!$location) {
return false;
}
if ($status < 300 || 399 < $status) {
return false;
}
header("location: " . $location, true, $status);
return true;
}
Per effettuare il redirect sarร sufficiente chiamare la funzione in questo modo:
if (redirect('https://www.nuovosito.com/nuova-pagina.php', 301)) {
// termino l'esecuzione dello script
exit;
}else{
// stampo a video l'errore
echo 'Il redirect non funziona';
}
Redirect temporizzato con PHP
Frequentando i forum dedicati a PHP mi รจ capitato di partecipare a discussioni in cui gli utenti affermano di essere โcostrettiโ ad utilizzare redirectin Javascript perchรฉ la funzione header() doi PHP non permette di definire la durata di attesa prima del redirect verso unโaltra risorsa.
Ciรฒ non รจ assolutamente vero, attraverso header(), infatti, รจ possibile agire sul valore di refresh che permette di definire il tempo di attesa prima di un redirect espresso in numero di secondi; si osservi per esempio il seguente listato:
<?php
header("refresh:5;url=nuova_pagina.php");
echo "Se il tuo browser non supporta il redirect clicka <a href=\"nuova_pagina.php\">qui</a>.";
?>
Nel caso proposto il redirect alla pagina โnuova_pagina.phpโ avverrร dopo 5 secondi di attesa; รจ possibile anche invertire le due righe dโistruzione mostrate evitando che lโinvio di un output prima della funzione header() produca un errore da parte del browser, ciรฒ sarร possibile utilizzando le funzioni ob_start() e ob_end_flush():
<?php
ob_start();
echo "Se il tuo browser non supporta il redirect clicka <a href=\"index.php\">qui</a>.";
header( "refresh:5;url=index.php" );
ob_end_flush();
?>
In questo modo ob_start() devierร il flusso dei dati verso il buffer dedicato allโesecuzione dellโapplicazione che verrร liberato al momento della chiamata a ob_end_flush(), quindi correttamente dopo aver impostato gli header.
Un redirect PHP con conta-click integrato
In talune circostanze, quando si gestisce un redirect, puรฒ essere utile tenere il conto di quante persone cliccano su un dato link o digitano ancora la URL di una nostra vecchia pagina web. Per fare ciรฒ possiamo, ovviamente, seguire diverse strade, in questa sede, tuttavia, opteremo per la piรน semplice: vediamo quindi come creare un redirect in PHP con conta-click inegrato senza ricorrere ad un database MySQL.
Per fare questo avremo bisogno di qualche riga di codice ed un bel file di testo (che chiameremo โcontatore.txtโ) al quale dovremmo settare i permessi di scrittura (chmod 666). Per quanto riguarda il file di testo: aprite il blocco note, scrivete 0 (zero) e salvate come โcontatore.txtโ.
Per quanto riguarda il codice PHP eccovi lo script commentato:
<?
// file di testo che uso come contatore
$miofile = 'contatore.txt';
// recupero il valore attuale del contatore
$visite = file($miofile);
// verifico che la funzione abbia avuto successo
if ($visite !== false) {
// Incremento il valore di 1
$visite[0]++;
// Apro il file in modalitร scrittura
$fp = fopen($miofile , 'w');
// Scrivo il valore numerico incrementato
fputs($fp , $visite[0]);
// Chiudo...
fclose($fp);
}
// Ora che abbiamo fatto i conti... possiamo fare il redirect!
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.nuovosito.com');
exit;
?>
Per sapere quante persone sono passate sulla nostra vecchia pagina web sarร sufficiente dare una sbirciata al nostro file โcontatore.txtโโฆ per farlo basterร digitarne la giusta URL allโinterno del vostro Browser (ad esempio: http://www.vecchiosito.com/contatore.txt).
Gestire i redirect in base allo USER AGENT
In PHP possiamo gestire i redirect in base a vari fattori, ad esempio verificando lo USER AGENT del client. Una situazione tipica รจ quella di un sito web che dispone di due versioni: una per desktop ed una appositamente ottimizzata per smartphone.
Se il nostro sito dispone di una versione mobile (il cosiddetto โm-siteโ), infatti, รจ utile verificare se le viste provengono da un computer o da un dispositivo mobile, quindi effettuare un redirect allโuna o allโaltra versione nel caso in cui il dispositivo in questione stia cercando di visualizzarne una non ottimizzata.
Ad esempio, se un cellulare prova a visualizzare www.mrw.it (od una pagina interna), effettueremo il redirect a mobile.mrw.it e viceversa se si tratta di un computer.
La seguente funzione verifica lo USER AGENT del dispositivo utilizzato dallโutente e restituisce il valore โwwwโ piuttosto che โmobileโ a seconda del caso:
<?php
function msite() {
$my_user_agent = strtolower($_SERVER["HTTP_USER_AGENT"]);
if (
strpos($my_user_agent, "alcatel") === FALSE &&
strpos($my_user_agent, "benq") === FALSE &&
strpos($my_user_agent, "blackberry") === FALSE &&
strpos($my_user_agent, "ericsson") === FALSE &&
strpos($my_user_agent, "galaxy") === FALSE &&
strpos($my_user_agent, "iphone") === FALSE &&
strpos($my_user_agent, "ipod") === FALSE &&
strpos($my_user_agent, "lg") === FALSE &&
strpos($my_user_agent, "motorola") === FALSE &&
strpos($my_user_agent, "nec-") === FALSE &&
strpos($my_user_agent, "nokia") === FALSE &&
strpos($my_user_agent, "sagem") === FALSE &&
strpos($my_user_agent, "samsung") === FALSE &&
strpos($my_user_agent, "sanyo") === FALSE &&
strpos($my_user_agent, "sharp") === FALSE &&
strpos($my_user_agent, "sie-") === FALSE &&
strpos($my_user_agent, "sony") === FALSE &&
strpos($my_user_agent, "panasonic") === FALSE &&
strpos($my_user_agent, "playstation portable") === FALSE &&
strpos($my_user_agent, "philips") === FALSE
) {
return 0;
} else {
return 1;
}
}
?>
Nella homepage della versione per computer del nostro sito, scriveremo:
<?php
if (msite() == 1) {
header("location: http://mobile.mrw.it/");
}
?>
Viceversa, sulla versione mobile scriveremo:
<?php
if (msite() == 0) {
header("location: https://www.mrw.it/");
}
?>
Verificare la correttezza di un redirect
Quando si pianificano dei reindirizzamenti, soprattutto se lโoperazione riguarda un grande numero di URL ed avviene secondo criteri logici articolati, รจ sempre buona norma verificare che il flusso dei redirect avvenga correttamente e con i giusti codici di stato.
Per effettuare questo tipo di controlli รจ possibile ricorrere ad un redirect checker cioรจ un tool in grado di verificare la catena di reindirizzamenti generata da una determinata URL. In Rete รจ possibile trovare diversi strumenti online di questo genere, tuttavia per chi fosse interessato, segnaliamo il Redirect Checker presente allโinterno del nostro canale Toolset.it, attraverso il quale รจ possibile controllare che i redirect impostati con PHP funzionino a dovere.