Redirect 301, pagine cancellate recuperate con .htaccess e Php

Molto spesso, a seguito di un aggiornamento, ci si trova davanti alla necessità di recuperare vecchie pagine di un sito non più esistenti, cioè di inserire un redirect dagli indirizzi vecchi ai nuovi contenuti.

Inserire un buon redirect 301 non rappresenta un inutile sfizio, si tratta infatti di una pratica importantissima, per trasferire il Page Rank dei vecchi url ai nuovi e per evitare che gli utenti si trovino davanti ad un errore.

Avendo un sito su piattaforma Apache, il metodo che illustrerò in questo articolo è probabilmente il più semplice per compiere l’operazione su piccoli siti, senza doversi impelagare in complesse regole o espressioni regolari da inserire nel file .htaccess.
Sarà sufficiente un minimo di conoscenza di Php, faremo fare a lui tutto il lavoro di filtraggio e reindrizzamento.

Per prima cosa occorre individuare tutte le pagine che posseggono dei link referenti, ma che non esistono più. Per farlo ci viene incontro Google, con i suoi Strumenti Google per il webmaster.
Nella sezione:
Diagnostica->Errori di scansione->Web->Non trovato
possiamo visionare un elenco di tutte le pagine del nostro sito linkate da qualche parte, ma che attualmente restituiscono un errore.
Possiamo anche scoprire quanti e quali link puntano a questi indirizzi, cosicché, nel caso fosse possibile, potremmo porre rimedio semplicemente aggiornando i link obsoleti trasferendo il loro flusso di Page Rank sulle nuove pagine.
Per tutti gli altri casi, in cui purtroppo non sempre è possibile aggiornare i link, entra in gioco il redirect 301.

Quando un utente o uno spider di un motore di ricerca accede ad una pagina non più esistente, ottiene un codice di errore 404. Salvo diverse personalizzazioni, il server restituisce una pagina predefinita, il tipico 404 Not Found.
Tramite il file .htaccess, possiamo imporre di utilizzare in caso di errore un file creato da noi, che possiamo chiamare non-trovato.php o in qualsiasi altro modo.

#riga dell’.htaccess che impone in caso di errore l’uso del file da noi creato
ErrorDocument 404 non-trovato.php

Da questo momento in poi, qualsiasi visita ad una pagina non trovata mostrerà il contenuto della pagina non-trovato.php
Vediamo come costruire questa paginetta, che ci aiuterà ad ottenere il nostro scopo.
La pagina di errore di base sarà qualcosa di simile:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Errore 404 – Pagina Non Trovata</title>
</head>
<body>
<h1>Pagina non trovata</h1>
<p>L’indirizzo richiesto <?php echo $_SERVER[‘REQUEST_URI’]; ?> non è stato trovato su questo server.</p>
<?php  echo $_SERVER[“HTTP_HOST”]; ?>
</i>
</body>
</html>

Così com’è, invierà un codice di errore http 404 e stamperà il messaggio di “Pagina non trovata” e l’indirizzo digitato.

Costruita questa struttura di base,  possiamo aggiungere dei controlli in testa alla pagina.

Mettiamo il caso di avere il sito www.example.com e di aver individuato una vecchia pagina, ora non più esistente, che si chiamava articolo-vecchio-sui-cani.html, magari avente 5 link su altri siti. Il contenuto ora è stato spostato al nuovo indirizzo cani.php.

In testa al file non-trovato.php, che si occupa della gestione dell’errore, possiamo inserire un controllo di questo genere:

<?php

if(strpos($_SERVER[‘REQUEST_URI’], “articolo-vecchio-sui-cani.html”)){
header (‘HTTP/1.1 301 Moved Permanently’);
header(“location: http://www.example.com/cani.php”);
}

?>

Il codice Php precedente verifica l’url richiesto dall’utente. Se contiene la stringa “articolo-vecchio-sui-cani.html”, corrispondente alla vecchia pagine, passa le due intestazioni http contenute nelle parentesi graffe.
Cioè anziché passare un errore 404, come farebbe per tutti gli altri indirizzi errati, passa un redirect permanente 301 e indica anche la nuova locazione.
L’utente perciò, senza accorgersi di nulla, si ritroverà trasferito al nuovo indirizzo funzionante. Lo stesso avverrà agli spider dei motori di ricerca.

La pagina di errore completa diventerà:

<?php

if(strpos($_SERVER[‘REQUEST_URI’], “articolo-vecchio-sui-cani.html”)){
header (‘HTTP/1.1 301 Moved Permanently’);
header(“location: http://www.example.com/cani.php”);
}

?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Errore 404 – Pagina Non Trovata</title>
</head>
<body>
<h1>Pagina non trovata</h1>
<p>L’indirizzo richiesto <?php echo $_SERVER[‘REQUEST_URI’]; ?> non è stato trovato su questo server.</p>
<?php echo $_SERVER[“HTTP_HOST”]; ?>
</i>
</body>
</html>

Ovviamente nel caso di più pagine da recuperare, si potrà ricopiare il blocco di codice che intercetta gli indirizzi e riadattarlo inserendo i dati del caso specifico. L’importante è inserire il tutto in testa alla pagina, senza lasciare neppure righi vuoti. Questo perché la funzione header() va richiamata prima che qualsiasi parte di pagina si stata stampata.

Non mi dilungo oltre con altri esempi, il concetto di base è piuttosto semplice.
Vi rimando ai commenti per eventuali dubbi.

3 thoughts on “Redirect 301, pagine cancellate recuperate con .htaccess e Php

  1. anotherbreed

    Credo ci sia un errore di sintassi: copiando la parte PHP su un editor, mi si evidenzia come commento la parte di URL dopo il doppio slash (//www.example.com…).

  2. Claudio Matarrelli Autore articolo

    Ciao, scusa per il ritardo di mesi, non ho avuto tempo nei mesi passati per seguire le decine di commenti che ogni settimana ricevo su vari articoli.

    Comunque non ci sono errori, o meglio, è colpa di wordpress che nel pubblicare quel codice ha sostituito i doppi apici con virgolette.

    Bisogna perciò sostituirli manualmente.

    Grazie per la segnalazione 🙂

  3. RadikSek

    Meet a guy to communicate and more
    write I won’t bite you +79967254947
    boys write WhatsApp +79967254947
    boys write WhatsApp +79967254947
    boys write WhatsApp +79967254947

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *