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.
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?
33 commenti
Trackback e pingback
[...] This post was mentioned on Twitter by yesWEBcan and Your Inspiration Web, mtx_maurizio. mtx_maurizio said: RT @YIW Il mod_rewrite…