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.

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...

Correggere l’errore the uploaded file exceeds the upload_max_filesize directive in php.ini

L'errore the uploaded file exceeds the upload_max_filesize directive in...

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ร