Il mod_rewrite e la magia di riscrivere gli URL (seconda parte)

Nella prima parte di questo articolo abbiamo visto due esempi molto semplici di rewrite dell’url. Quello che faremo adesso sarà inserire il nome del prodotto nell’url. Perchè?

Dato che l’url riscritto sarà quello registrato dal motore di ricerca, diventa estrememente interessante visualizzare il nome del prodotto nell’url.

Un aspetto al quale dovremo prestare particolare attenzione riguarda il limite per cui la stringa di un url non ammette spazi e caratteri speciali o accentati. Dovremo dunque passare la stringa che rappresenta il nome del prodotto in un “filtro” che sostituisca gli spazi con dei trattini, le lettere accentate con le corrispondenti non accentate e che elimini gli eventuali caratteri speciali.

Un esempio di questa tecnica lo puoi vedere nell’url che contiene questo articolo. WordPress utilizza il metodo dei permalink, ovvero trasforma il titolo dell’articolo in un dato univoco. Se utilizzi WordPress, puoi provare a creare un articolo ed intitolarlo prova test. Verrà creato il permalink prova-test. Se ora provi a creare un altro articolo ed intitolarlo ancora prova test, il permalink che verrà creato sarà prova-test-2. Questo in quanto il permalink sarà l’unico dato a disposizione per andare a riprendere l’articolo e dunque dovrà essere – come già detto – un dato univoco.
Il sistema utilizzato da WordPress è piuttosto complesso, prevede delle trasformazioni e delle verifiche e utilizza chiamate asincrone. In questo articolo vedremo un modello semplificato ma comunque valido (inoltre, per inciso, sono di vecchia scuola e per quello che mi riguarda il dato univoco ha un solo nome: chiave primaria). Passeremo dunque il nome del prodotto, ma in qualche modo anche l’id.

Che tipo di url vogliamo ottenere per ottimizzare l’indicizzazione?

Quello che vogliamo ottenere é un url di questo genere:

https://www.tuosito.com/prodotto56/tosa-erba-elettrico-grande

Se non utilizzassimo l’url rewrite, la costruzione del link per visualizzare i dettagli del prodotto, sarebbe simile a questa

//lettura  dei valori dal database
echo '<a href="prodotti.php?id=' . $id .  '">' . $nomeProdotto . '</a>';

Se vogliamo produrre un url come quello visto in precedenza dovremo invece procedere in questo modo:

//lettura dei valori dal database
//filtraggio  del nome prodotto
echo '<a href="prodotto' . $id . '/' .  $nomeProdottoFiltrato . '">' . $nomeProdotto . '</a>';

Come abbiamo visto all’inizio, se vogliamo passare il nome prodotto nell’url, dovremo prima ripulirlo da lettere accentate e caratteri speciali che potrebbero creare problemi e successivamente sostituire anche gli spazi con dei trattini.

Ripuliamo il nome del prodotto che vogliamo passare come url

Creiamo la funzione CleanString() ed iniziamo a rimpiazzare le lettere accentate con le medesime lettere ma senza accenti utilizzando la funzione str_ireplace().

 function CleanString($string)
 {
     $strResult = str_ireplace("à", "a", $string);
     $strResult  = str_ireplace("á", "a", $strResult);
     $strResult =  str_ireplace("è", "e", $strResult);
     $strResult =  str_ireplace("é", "e", $strResult);
     $strResult =  str_ireplace("ì", "i", $strResult);
     $strResult =  str_ireplace("í", "i", $strResult);
     $strResult =  str_ireplace("ò", "o", $strResult);
     $strResult =  str_ireplace("ó", "o", $strResult);
     $strResult =  str_ireplace("ù", "u", $strResult);
     $strResult =  str_ireplace("ú", "u", $strResult);
     $strResult =  str_ireplace("ç", "c", $strResult);
     $strResult =  str_ireplace("ö", "o", $strResult);
     $strResult =  str_ireplace("û", "u", $strResult);
     $strResult =  str_ireplace("ê", "e", $strResult);
     $strResult =  str_ireplace("ü", "u", $strResult);
     $strResult =  str_ireplace("ë", "e", $strResult);
     $strResult =  str_ireplace("ä", "a", $strResult);

Sostiuiamo anche l’apostrofo con uno spazio:

$strResult =  str_ireplace("'", " ", $strResult);

Ora possiamo rimuovere tutto quello che non è un carattere normale o un numero:

$strResult  = preg_replace('/[^A-Za-z0-9 ]/', "", $strResult);

In seguito rimuoviamo eventuali spazi prima e/o dopo la stringa con la funzione trim():

$strResult = trim($strResult);

Adesso una piccola rifinitura. Se mai dovessero esserci dei doppi (o più) spazi all’interno della stringa, riduciamoli ad un solo spazio:

$strResult  = preg_replace('/[ ]{2,}/', " ", $strResult);

L’espressione regolare precedente trova tutto quello che è due o più spazi e li sostituisce con un solo spazio.

Ora non ci resta che sostituire gli spazi con dei trattini:

$strResult = str_replace("  ", "-", $strResult);

Ed ecco la nostra funzione

function CleanString($string)
{
    $strResult = str_ireplace("à", "a", $string);
    $strResult  = str_ireplace("á", "a", $strResult);
    $strResult =  str_ireplace("è", "e", $strResult);
    $strResult =  str_ireplace("é", "e", $strResult);
    $strResult =  str_ireplace("ì", "i", $strResult);
    $strResult =  str_ireplace("í", "i", $strResult);
    $strResult =  str_ireplace("ò", "o", $strResult);
    $strResult =  str_ireplace("ó", "o", $strResult);
    $strResult =  str_ireplace("ù", "u", $strResult);
    $strResult =  str_ireplace("ú", "u", $strResult);
    $strResult =  str_ireplace("ç", "c", $strResult);
    $strResult =  str_ireplace("ö", "o", $strResult);
    $strResult =  str_ireplace("û", "u", $strResult);
    $strResult =  str_ireplace("ê", "e", $strResult);
    $strResult =  str_ireplace("ü", "u", $strResult);
    $strResult =  str_ireplace("ë", "e", $strResult);
    $strResult =  str_ireplace("ä", "a", $strResult);
    $strResult =  str_ireplace("'", " ", $strResult);

    $strResult = preg_replace('/[^A-Za-z0-9 ]/', "", $strResult);
    $strResult = trim($strResult);
    $strResult =  preg_replace('/[ ]{2,}/', " ", $strResult);

    $strResult = str_replace(" ", "-", $strResult);

    return $strResult;
}

In questo modo la creazione del nostro link sarà molto semplice:

//lettura  dei valori dal database
echo '<a href="prodotto' . $id . '/' .  CleanString($nomeProdotto) . '">' . $nomeProdotto . '</a>';

Scriviamo la regola di rewrite url

A questo punto possiamo procedere con l’implementazione della regola di rewrite in questo modo:

RewriteEngine On
RewriteRule  ^prodotto([0-9]+)/([a-zA-Z0-9-]+)$ prodotti.php?id=$1

Questa regola stabilisce che: Quando trovi la stringa prodotto seguita da un numero di una o più cifre, seguita da “/”, seguita da una stringa alfanumerica (che può contenere il carattere “-“) di uno o più caratteri, richiedi la pagina prodotti.php?id=ilNumeroCheHaiTrovatoNellaPrimaSottostringa.

La seconda sottostringa non ci interessa in quanto disponiamo già dell’id che servirà a caricare i dettagli del prodotto, ma interesserà invece l’ottimizzazione per i motori di ricerca, per i quali sarà così disponibile, già a livello di url, il nome del prodotto.

Conclusione

Abbiamo visto tre esempi basilari di come implementare la riscrittura degli url. Teoricamente non vi sono limiti alle possibilità offerte da questo modulo di Apache se non nella conoscenza che abbiamo delle espressioni regolari. Infatti, come hai visto, si tratta in gran parte di questo.
E tu, utilizzi questa tecnica per migliorare l’indicalizzazione dei tuoi siti?

Tag: ,

L'autore

Maurizio è sposato con la triade PHP - MySql - Apache e, non pago, ha un'amante chiamata jQuery. Ha un blog dove cerca di descrivere nei minimi particolari sia la moglie che l'amante. La sua vera specialità è la realizzazione di gestionali complessi anche se non rifiuta mai un sito web. +

Sito web dell'autore | Altri articoli scritti da

Articoli correlati

33 commenti

Trackback e pingback

  1. Tweets that mention Il mod_rewrite e la magia di riscrivere gli URL (seconda parte) | Your Inspiration Web -- Topsy.com
    [...] This post was mentioned on Twitter by yesWEBcan and Your Inspiration Web, mtx_maurizio. mtx_maurizio said: RT @YIW Il mod_rewrite…