21

Come ben sappiamo il modo migliore di avvisare i motori di ricerca che una pagina ha cambiato posizione, senza generare fastidiosi errori 404, che intasano i tools webmaster, è quello di creare un redirect 301 della pagina stessa.

In passato, per farlo, il modo principale era quello di creare un’apposita regola nel file .htaccess, procedura impegnativa e a volte rischiosa.

Grazie invece alle funzioni messe a disposizione da WordPress questa pratica è diventata davvero semplicissima, tanto che esistono numerosi plugin per effettuarla!

Ma a noi (generalmente, dato che ci sono ottime eccezioni) non piacciono i plugin per cui vediamo un pò come implementare un semplice sistema di redirect 301 delle pagine nel nostro file functions.php .

Innanzitutto creiamo un array contente i nostri redirect:

redirect_list = array(
    'http://www.sito.it/paginavecchia.html' => 'http://www.sito.it/paginanuova/',
    'http://www.sito.it/paginavecchia_2.html' => 'http://www.sito.it/paginanuova2/',
);

Una volta che abbiamo definito la nostra array, in cui essendo utilizzata come indice la pagina vecchia non può essere duplicata, dobbiamo dire a WordPress dove e come processarla ma prima abbiamo bisogno di una funzione di supporto che restituisca l’url della pagina richiesta dal visitatore per poterla confrontare con la nostra lista:

/**
 * Funzione che si occupa di restituire l'url richiesto dal visitatore
 */

function curPageURL() {
    $pageURL = 'http';
    if ( isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") $pageURL .= "s";
    $pageURL .= "://";
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    return $pageURL;
}

Ed infine il codice completo per realizzare il nostro redirect 301 con WordPress.

/**
 * Funzione che si occupa di restituire l'url richiesto dal visitatore
 */

function curPageURL() {
    $pageURL = 'http';
    if ( isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") $pageURL .= "s";
    $pageURL .= "://";
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    return $pageURL;
}

/**
 * Redirect 301
 */

// Ci agganciamo all'azione che viene eseguita alla scelta del template di cui fare l'output
add_action( 'template_redirect','redirect_301' );

function redirect_301() {
    
    // Recuperiamo l'url corrente
    $pageurl = curPageURL();

    // Lista dei redirect
    $redirect_list = array(
        'http://www.sito.it/paginavecchia.html'   => 'http://www.sito.it/paginanuova/',
        'http://www.sito.it/paginavecchia_2.html' => 'http://www.sito.it/paginanuova2/'
    );
    
    // Se l'url richiesta è presente nella mia array eseguo il redirect 301 alla risorsa corretta
    if ( isset( $redirect_list[$pageurl] ) ) {
        header( "HTTP/1.1 301 Moved Permanently" );    // Restituisco l'errore 301 nell'header
        header( "Location: $redirect_list[$pageurl]" );    // Indico la posizione della nuova pagina nell'header
        exit();   // Fermo l'esecuzione dello script
    }

}

Chiaramente questa funzione è allo stato grezzo. Potrete implementare un pannellino wp-admin che permetta di inserire in tempo reale nuovi redirect salvandoli in una option.

Infine una chicca, per testare che la vostra pagina faccia il redirect correttamente ci sono diverse risorse online oppure se siete in ambiente Mac (e credo Unix in generale) potete usare il comando curl per ottenere l’header della pagina digitando nel vostro terminale:

curl -I http://www.sito.it/paginavecchia.html
  1. Complimenti per questo vostro fantastico progetto, spero per voi che avrete soddisfazioni anche a livello di visite fin da presto! Complimenti ancora!

  2. Ho un problema. Sto smanettando su di un sito fatto da un’altro. Si tratta di http://www.martex.it Sulla home page ci sono gli ultimi post ma, su di alcuni, come ad esempio “orgate 2012 gallery” se ci clicco mi manda ad una pagina. Solo alcuni. Nessun plugin installato. Qualche idea?

    1. Ciao Sergio,
      Se hai compreso come modificare il file .htaccess la procedura “manuale” è piuttosto semplice.
      Fai iniziare il file con

      Options +FollowSymLinks
      RewriteEngine On

      Poi, di seguito, aggiungi le regole (una per linea e stando attento che non ci siano spazi di troppo):

      RewriteRule ^category/marche/mercedes/(.*)$ /category/marca/mercedes-marca/$1 [R=301,NC,L]

      Non ho visto se il tuo è un sito wordpress. In ogni caso il codice sopra va inserito prima di qualsiasi altro codice già presente all’interno del file .htaccess.

      1. Grazie mille, proverò a scrivere il file… In effetti non l’ho ancora individuato, pensavo di trovarlo nell’editor del tema ma non c’è. Si, il sito è wordpress. Intanto usando wordpress inizio ad inserire i comandi, che ne dici? Grazie 😉

        1. Ciao Sergio, ti sconsiglio vivamente di modificare i file dall’editor del tema… se sbagli qualcosa rimani “chiuso fuori”. Devi accedere con un client ftp e vedrai che nella cartella principale di wordpress troverai un file .htaccess

      2. Ciao, infatti ti do conferma di aver fatto tutto solo :)) Ho provato a caricare il file ma dopo il sito non va. Collegandosi mi da “internal errore server” etc etc. Posso inviarti il file via mail?

          1. Grazie mille della disponibilià! Ieri notte, a quanto pare, ho risolto 🙂 Gli errori sono andati tutti via! Ancora grazie mille 😉

      3. Confermo di aver fatto tutto da solo, infatti c’è qualche errore nel file :)) ho provato a caricarlo tramite il pannello di controllo di aruba ma il sito va down. Nello specifico appare una scritta “internal error server” etc etc. Posso mandartelo via mail? Sicuramente ho fatto qualche casino 🙂 Cmq ho rimesso quello vecchio che mi ero salvato

  3. Ciao, sono appena entrato tramite il file manager di Aruba ed, in effetti, ho avuto riscontro di due file: .htaccess.swp e .htaccess, quest’ultimo dentro ha questo codice:

    # BEGIN WordPress
    
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    
    # END WordPress
    

    Devo sostituire il RewriteRule con questo? E poi di seguito mettere tutte le altre marche?
    RewriteRule ^category/marche/mercedes/(.*)$ /category/marca/mercedes-marca/$1 [R=301,NC,L]

    Grazie mille per la disponibilità.

    1. No, devi inserire il codice che ti ho dato prima di # BEGIN WordPress. Un esempio potrebbe essere:

      Options +FollowSymLinks
      RewriteEngine On
      
      # Tue regole
      RewriteRule ^category/marche/mercedes/(.*)$ /category/marca/mercedes-marca/$1 [R=301,NC,L]
      
      # BEGIN WordPress
      RewriteEngine On
      RewriteBase /
      RewriteRule ^index\.php$ – [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . /index.php [L]
      # END WordPress
      1. Ciao, ho creato il file su “blocco note” 🙂 Inizia così:

        Options +FollowSymLinks
        RewriteEngine On
        
        # Tue regole
        RewriteRule ^category/marche/mercedes/(.*)$ /category/marca/mercedes-marca/$1 [R=301,NC,L]
        RewriteRule ^category/marche/alfa-romeo/(.*)$ /category/marca/alfa-romeo-marca/$1 [R=301,NC,L]
        RewriteRule ^category/marche/ferrari/(.*)$ /category/marca/ferrari-marca/$1 [R=301,NC,L]
        RewriteRule ^category/marche/nissan/(.*)$ /category/marca/nissan-marca/$1 [R=301,NC,L]
        RewriteRule ^category/marche/honda/(.*)$ /category/marca/honda-marca/$1 [R=301,NC,L]
        RewriteRule ^category/speciali/mobilita-sostenibile/(.*)$ /category/speciali/mobilita-sostenibile-marca/$1 [R=301,NC,L]
        RewriteRule ^category/marche/kawasaki/(.*)$ /category/marca/kawasaki-marca/$1 [R=301,NC,L]
        
        .....
        
        RewriteRule ^category/marche/koenigsegg/(.*)$ /category/marca/koenigsegg-marca/$1 [R=301,NC,L]
        
        # BEGIN WordPress
        RewriteEngine On
        RewriteBase /
        RewriteRule ^index\.php$ – [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.php [L]
        # END WordPress
        

        (e finisce così)

        Provo a fare l’upload sul server?

        Grazie!!!

          1. Figurati! Non ho fatto altro che darti le nozioni basilari poi hai fatto tutto da solo!

  4. Salve,
    mi sono avvicinato al Php da pochissimo e sto scoprendo che ha una grandissima flessibilità e potenzialità.
    Per quanto riguarda il codice per effettuare il redirect non riesco a capire questa parte:
    add_action( ‘template_redirect’,’redirect_301′ );

    la parte redirect_301 cosa indica? è il modello di pagina php da usare?

    Grazie e complimenti per il sito.

Lascia un commento

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