back to top

Come fare un redirect con PHP?

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.

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.

Altri contenuti interessanti

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Cannot modify header information โ€“ headers already sent: come risolvere lโ€™errore PHP

L'errore di PHP cannot modify header information - headers...

Ricavare lโ€™estensione di un file con PHP

Quando si lavora con i file in un'applicazione web,...

GD Library: creazione, manipolazione e ridimensionamento immagini con PHP

Le librerie GD (o GD Library), sono componenti fondamentali...

PHP: impostare il fuso orario italiano

Le tue pagine PHP non mostrano lโ€™orario corretto? Probabilmente...

5 script PHP per gestire BBCode

A volte puรฒ aversi l'esigenza di dover offrire agli...
Pubblicitร