Assumerò che il lettore sia familiare con il concetto di "SEO friendly URLs". In caso contrario è consigliabile leggere prima queste pagine:
- http://www.google.com/support/webmasters/bin/answer.py?answer=76329
- http://www.avangate.com/articles/url-rewriting_70.htm
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.