Script lato server e url dall'aspetto statico: i benefici dell'url rewriting nel posizionamento sono noti ai più, quindi non li illustreremo in questa occasione... tuttavia un dubbio che spesso affiora nelle menti dei SEO, specialmente se alle prime armi, riguarda il come comportarsi con le pagine dotate di query string e già posizionate. Meglio lasciar perdere oppure applicare comunque la cosmesi degli url rischiando di turbare qualche "delicato equilibrio"? Cosa dire poi del fatto che spesso ci si ritroviamo con una serie di pagine duplicate (quella con query string e quella nuova dall'aspetto statico)?
Ricordiamo infatti che il rewriting presuppone che i vecchi url dotati di query string rimangano sempre validi: in teoria, se la struttura di navigazione del sito viene modificata correttamente, e gli url con query string non ricevono più link, nel giro di qualche tempo i nuovi url statici agli occhi degli spider dovrebbero gradualmente soppiantare quelli dotati di query string.
Spesso, tuttavia, quando le vecchie pagine sono particolarmente "forti" (e magari continuano ad essere linkate dall'esterno) i tempi di questo passaggio si allungano in modo indefinito...
In generale, quando un url ne deve sostituire un altro, esiste un metodo consolidato per dire agli spider che una pagina ne soppianterà un'altra, e cioè inviare un header HTTP 301 (redirect permanente). Nel caso del rewriting però rischiamo di creare un loop di questo tipo:
url-statico -> rewrite in url con query string -> 301 redirect all'url-statico.....ops!
Esistono due metodi alternativi per ovviare al problema attraverso le regole di rewriting e senza mettere mano al codice degli script lato server.
Metodo 1: sintassi utilizzabile da chi abbia accesso al file di configurazione di Apache httpd.conf.
RewriteEngine On
#Se non c'è query string applico la riscrittura da statico a dinamico
RewriteCond %{QUERY_STRING} ^$
#La regola traduce 11/5.html in index.php?id=11&categoria=5
RewriteRule ^/([^/]+)/([^/]+).html /index.php?id=$1&categoria=$2 [L]
#Se la query string è presente
RewriteCond %{QUERY_STRING} ^(.*)=(.*)&(.*)=(.*)$
#Redirect 301 da in index.php?id=11&categoria=5 a 11/5.html
RewriteRule ^.*$ http://localhost/%2/%4.html? [R=301,L]
Le regole appena illustrate sono validissime in httpd.conf .htaccess loop interpretate ad ogni accesso
Metodo 2:
RewriteEngine On
#Se la query string è assente
RewriteCond %{QUERY_STRING} ^$
#Effettuo il rewriting ed aggiungo una variabile "semaforo" (rew=1) alla query string
RewriteRule ^([^/]+)/([^/]+).html index.php?pagina=$1&categoria=$2&rew=1 [L]
#Se la query string è presente e contiene già la variabile "semaforo"...
RewriteCond %{QUERY_STRING} ^(.*)=(.*)&(.*)=(.*)$
RewriteCond %{QUERY_STRING} !^.*rew=1.*$
#Effettuo il redirect 301 dall'url dotato di query string a quello pseudo statico
RewriteRule ^.*$ http://localhost/%2/%4.html? [R=301,L]
In entrambi i metodi la chiave di volta è rappresentata dalla direttiva RewriteCond riscrittura condizionale
Da notare anche che i valori catturati con le regular expressions nella query string vengono immagazzinati all'interno delle variabili %1, %2, %n.
Gli esempi sono ipotetici ma verosimili, a "http://localhost" va ovviamente sostituito il dominio di turno.
Per ulteriori chiarimenti sulla sintassi ci viene in aiuto la documentazione di Apache mod_rewrite