SEO friendly URLs con apache mod_rewrite

30 giugno 2011 Roberto Puzzanghera0 commenti

Assumerò che il lettore sia familiare con il concetto di "SEO friendly URLs". In caso contrario è consigliabile leggere prima queste pagine:

Al costo di "imbrodarmi" un po', utilizzerò come caso reale un mio lavoro: http://wildzone.it. Si tratta di una galleria di immagini dove i contenuti sono organizzati gerarchicamente in questo modo:

LINGUA -> CATEGORIA -> GALLERIA -> IMMAGINE

Di conseguenza la maniera più ovvia di scrivere gli indirizzie web sarebbe la seguente: http://wildzone.it/en/italy-4/seaside-of-sardinia-19/orosei-117f.html (indirizzo esterno). L'indirizzo interno, gestito in realtà dal CMS (Content Managment System) e più conciso, è: http://wildzone.it?l=en&cat=4&gal=19&id=117. Come si può vedere, l'indirizzo esterno è SEO and user friendly. Esso comprende dentro di sè il numero id della lingua/categoria/galleria/foto. Inoltre, la lettura dell'indirizzo fornisce al visitatore una migliore comprensione dell'argomentodel sito e della sua organizzazione intrerna. Lo stesso vale per Google.

Usare mod_rewrite per fare la trasformazione

mod_rewrite può essere di aiuto nel convertire gli indirizzi SEO friendly (esterni) usati dal visitatore negli indirizzi interni (quelli con le query) che sono graditi al CMS.

E' necessario configurare apache in questo modo:

./configure --enable-rewrite

Inoltre è necessario abilitare mod_rewrite  e le .htaccess Options nella configurazione del virtual host:

AllowOverride Options FileInfo

E queste sono le istruzioni che ho messo nel mio file .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine on

# photo page
RewriteCond %{REQUEST_URI} .*f.html$
RewriteRule ^(\w+)/.*-(\w+)/.*-(\w+)/.*-(\w+)f\.html$ ?l=$1&sez=$2&gal=$3&id=$4 [L]

# thumbnails page
RewriteCond %{REQUEST_URI} .*g.html$
RewriteRule ^(\w+)/.*-(\w+)/.*-(\w+)g\.html$ ?l=$1&sez=$2&gal=$3 [L]
</IfModule>

Vediamo in dettaglio le regular expressions.

Questa riga seleziona le pagine il cui nome termina con "f.html" e esegue la regola seguente (la "f" è usate per distinguere le pagine delle foto dalle altre).

RewriteCond %{REQUEST_URI}   .*f.html$ 

Se la condizione qui sopra è soddisfatta questa regola viene eseguita (spiegherò in edttaglio la regular expression):

RewriteRule

^ l'espressione deve essere all'inizio della stringa

( inizio del pattern

\w+ a sequence of characters

) fine del pattern. (\w+) cattura la stringa della lingua ("en" o "it"). Essa sarà riscritta nella variabile $1.

/ ci aspetta un carattere slash

.*- zero o più caratteri per il titolo della categoria seguiti da un segno meno che precede l'id della categoria

(\w+) un altro pattern, che cattura l'di della categoria. Sarà trasformato nella vartiabile $2

/ un carattere slash

.*- zero o più caratteri seguiti da un segno meno

(\w+) pattern che cattura l'id della galleria. Sarà riscritto nella variabile $3

/ un carattere slash

.*- zero o più caratteri seguiti da un segno meno

(\w+) pattern che cattura l'id della foto. Sarà riscritto nella variabile $4

f il carattere f è usato per identificare la regola associata alla pagina delle foto

\.html \ è il carattere di escape, poichè il punto è un carattere speciale. Qui ci si aspetta una stringa ".html".

$ l'espressione deve essere alla finedella stringa.

?l=$1&sez=$2&gal=$3&id=$4 ecco come l'indirizzo sarà riscritto. $1, $2, $3, $4 sono rispettivamente i quattro pattern di cui sopra.

[L] dice ad Apache di terminare il processamento della regola per quanto riguarda questa richiesta.

Aggiungi un commento