Url Rewriting e pagine con query string ma già posizionate

SEO

Ciclo InfinitoRiprendo 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

Rewrite Loop!

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) .


Articolo nelle categorie | Featured, SEO

Potrebbero interessarti anche questi articoli correlati:
Pare che questo post sia particolare: non abbiamo trovato articoli correlati.
Salva e condividi questo post: post<li>
Vuoi partecipare? Vota questo articolo!
1 Stella2 Stelle3 Stelle4 Stelle5 Stelle (No Ratings Yet)
Loading ... Loading ...

10 Commenti su questo articolo

  1. Luca ha scritto:

    Come si gestire i POST delle form ottimizzati per SEO?

  2. Fabio Sutto ha scritto:

    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

  3. Luca ha scritto:

    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.

  4. Fabio Sutto ha scritto:

    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.

  5. danielix ha scritto:

    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.

  6. Fabio Sutto ha scritto:

    Ciao Danielix,

    stai lavorando su piattaforma Windows, con quale sistema di rewriting? ISAPI Rewrite?

  7. danielix ha scritto:

    sono su linux e sto cercando di lavorare su file htaccess

  8. Fabio Sutto ha scritto:

    Sei su linux ma hai estensione .asp, hai modificato la configurazione di Apache per far eseguire le pagine .asp come altro interprete?

  9. Igor ha scritto:

    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!

  10. Fabio Sutto ha scritto:

    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.

Lascia il tuo commento

  • Tags
  • Popolari
  • Consigliati
  • Commentati
  • Iscriviti !
Iscriviti al feed RSS di OnlineMarketingBlog!
News e suggerimenti di Web marketing: iscriviti al feed RSS di Online Marketing Blog per rimanere sempre aggiornato!
Fai pubblicità su OMB

OMB – gli autori

  • Federico Calore si occupa di web marketing e motori di ricerca per passione e professione: è consulente esperto di search engine marketing, web analysis e online advertising.
    Logo Adwords Qualified Professional
  • Fabio Sutto, sviluppatore server-side dal 1998, è passato dalla programmazione ai motori di ricerca, quindi al web marketing e al web 2.0: nell'attesa delle novità che verranno.
  • Chi scrive su OMB? Visita il profilo di tutti gli autori di OMB.

Categorie