Riprendo un argomento che ho affrontato più di un anno fa sul Blog di HTML.it, il titolo è identico a quello del post originale (la ragione la spiegherò tra breve).
La Questione
Nel corso dell’ultimo anno i motori di ricerca sono migliorati molto quanto alla capacità di indicizzare le pagine dotate di query string ( e cioè la parte di url che viene dopo il “?”), ovviamente molto dipende dalla forza intrinseca di un sito (anzianità, link popularity etc. etc.) e dalla quantità di parametri passati nella stringa, ma oggi non è così raro trovare pagine dotate di un url non ottimizzato eppure ben posizionate anche su keyword competitive.
Ad ogni modo, quale che sia la visibilità del nostro sito, è sempre conveniente applicare la riscrittura degli url (anche per ragioni legate all’usabilità) ma nel caso di pagine con query string indicizzate o, peggio ancora, posizionate ci troviamo dinanzi ad alcune difficoltà:
- come preservare i navigatori che per un po’ continueranno a raggiungere vecchi url attraverso i risultati dei motori di ricerca?
- Come velocizzare l’indicizzazione dei nuovi url e rendere l’inevitabile discesa nei posizionamenti il più breve possibile?
- Come evitare che Google consideri le pagine dai nuovi url riscritti alla stregua di cloni delle pagine preesistenti?
Un intervento importante è sicuramente quello di isolare i vecchi url, rendendoli irraggiungibili dagli spider, sostituendo i nuovi url riscritti in tutti i collegamenti della navigazione interna del sito: in questo modo, nel giro di qualche settimana, le nuove pagine *dovrebbero* essere indicizzate automaticamente al posto delle vecchie…però Google è tutt’altro che infallibile quindi, specialmente se ci ritroviamo tra le mani un sito che genera ogni mese diverse migliaia di Euro di fatturato, non è il caso di creare sconvolgimenti di questo genere a cuor leggero.
La soluzione più ovvia a questo problema si chiama Header Redirect 301 (ovvero permanente), in questo modo possiamo indirizzare esplicitamente spider e navigatori dalle vecchie pagine alle nuove.
Evitare i LOOP infiniti
Il grosso problema nel caso del rewriting è che gli url dall’aspetto statico in realtà, negli “internals” di Apache, fanno riferimento all’url con query string originario (in sostanza l’url rewriting è un’operazione di maquillage che non intacca la programmazione alto server se non in modo minimo); quindi nel caso di un ulteriore redirect 301 dall’url con query string a quello “statico” si verrebbe a creare una situazione come quella descritta nell’immagine sottostante, nella migliore delle ipotesi otterremo un errore 500 del server

Diventa quindi fondamentale capire quando il redirect vada effettuato e quando no
- Se l’url con query string viene raggiunto direttamente, ci sarà redirect 301
- Se l’url viene raggiunto a seguito del Rewriting, no
E’ possibile ottenere questo risultato applicando delle variabili “semaforo”, ecco le due sintassi da utilizzare (che cambiano qualora le direttive siano state inserite nel file .htaccess, anzichè direttamente nell’httpd.conf di Apache):
+ Regole per 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 direttive appena viste sono valide nel file di configurazione di Apache ma in un file .htaccess creerebbero comunque un loop, in quanto le regole al suo interno vengono interpretate ad ogni accesso alle pagine (anche a seguito di una riscrittura).
+ Sintassi da utilizzare in file .htaccess
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, che consente una riscrittura condizionale sulla base del contenuto della query string, da notare anche che i valori catturati con le regular expressions, 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 sul mod_rewrite.
Anche se ho approfondito alcuni aspetti e modificato completamente il contenuto, ho utilizzato lo stesso identico titolo dell’articolo originale per capire come si comporterà Google confrontando due blog molto differenti tra loro (quanto a forza e link popularity) .





novembre 8th, 2007 alle 14:52
Come si gestire i POST delle form ottimizzati per SEO?
novembre 8th, 2007 alle 15:06
Ciao Luca,
se ho capito la domanda…
Dal punto di vista SEO non c’è motivo di gestire le informazioni raggiungibili via POST
[EDIT]
Mi spiego meglio: se ci sono informazioni e contenuti che è utile far indicizzare ai motori di ricerca, devono essere raggiungibili via GET
novembre 8th, 2007 alle 18:17
Ti faccio un esempio, molto probabilmente mi sono spiegato male.
Ipotizza una form con POST o GET, quello che cerco di fare e’ avere come risultato del form, nella url, direttamente sito.com/search/par1/key/par2/key2 invece del classico sito.com?par1=key1&par2=key2
Nell’articolo spieghi come fare un redirect, in parte risolve la problematica, vorrei se possibile, senza redirect.
novembre 8th, 2007 alle 18:28
Un form manderà sempre le variabili in query string, a meno che tu non faccia un qualche magheggio con javascript al momento del submit (cosa possibilissima ma che rendela risorsa irraggiungibile allo spider).
Anche se gli spider a volte fanno il submit dei form, se hai dei contenuti veramente importanti da far trovare, devi renderli raggiungibili attraverso link html.
mod_rewrite se ben ricordo può gestire il metodo POST, ma la questione fondamentale è un’altra: dal punto di vista SEO non avrai benefici.
gennaio 12th, 2010 alle 13:57
ciao, io non riesco a far leggere il .htaccess come 301 una chiamata di questo genere
/prodotto2.asp?nomep=nome-del-prodotto&prodotto=1237&catcode=124&testa=n&cat_id=134
mi potete aiutare? grazie.
gennaio 12th, 2010 alle 15:17
Ciao Danielix,
stai lavorando su piattaforma Windows, con quale sistema di rewriting? ISAPI Rewrite?
gennaio 12th, 2010 alle 16:03
sono su linux e sto cercando di lavorare su file htaccess
gennaio 13th, 2010 alle 0:13
Sei su linux ma hai estensione .asp, hai modificato la configurazione di Apache per far eseguire le pagine .asp come altro interprete?
novembre 4th, 2011 alle 18:46
Cio ho seguito le tue istruzioni.
ho inserito queste istruzione nel .htaccess
RewriteEngine on
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^articles/([^/]+)/([^/]+).php$ /articles.php?lang=$1&art=$2&rew=1 [L]
RewriteCond %{QUERY_STRING} ^(.*)=(.*)&(.*)=(.*)$
RewriteCond %{QUERY_STRING} !^.*rew=1.*$
RewriteRule ^.*$ http://www.lachirurgiarobotica.it/%2/%4.php? [R=301,L]
ma non mi da un redirect del dinamico bensì un 404.
Come mai?
Grazie!
novembre 5th, 2011 alle 11:54
Ciao,
dando per scontato che l’url di arrivo sia corretto, se ottieni un 404 è probabile che l’aggiunta della variabile &new=1 non venga accettata dalla programmazione lato server.
Preciso che questa tecnica è oggi per certi versi obsoleta, infatti quasi sempre oggi (visto che oggi è possibile) preferisco in questi casi applicare il rel=”canonical” nella pagina. Più lento ma complessivamente meno “impattante” a livello SEO su siti di grandi dimensioni e con tanti url da redirigere.