Url Rewriting e pagine con query string ma già posizionate

Martedì 10 Ottobre 2006 - 10:26

di Fabio Sutto

Motori di ricerca

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 ma in un file .htaccess creerebbero comunque un loop, in quanto le regole al suo interno vengono interpretate ad ogni accesso (anche a seguito di una riscrittura).

Metodo 2: sintassi utilizzabile in file di configurazione per directory .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 della presenza e del contenuto della query string.

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 sul mod_rewrite.

Tags:

Categoria: Motori di ricerca | Permalink

Commenti

1

Un metodo alternativo per non usare il semaforo è quello di rinominare il file php (ad esempio da index.php a index2.php) e fare il redirect per gli accessi da index.php

# - postato da Senamion - 10 Ottobre 2006 - 11:38

2

Link salvato sul mio account del.icio.us :-)

# - postato da Alessio Michelini - 10 Ottobre 2006 - 11:39

3

Grazie Fabio, ottimo suggerimento :)

# - postato da Fabrizio Calderan - 10 Ottobre 2006 - 11:56

4

@Senamion

certamente si può fare come dici, anzi è il metodo più diffuso. La comodità della “variabile semaforo” è che non serve toccare il codice PHP nè rinominare i file.

# - postato da Fabio Sutto - 10 Ottobre 2006 - 12:07

5

Rinominando il file il codice PHP non va comunque modificato in quanto l’htaccess punta al nuovo file.
Semplicemente viene inviato il 301 per il vecchio nome file (da .htaccess o da codice, allora in questo caso è da modificare il php).

Comunque è un tutorial utilissimo. Complimenti!

# - postato da Senamion - 10 Ottobre 2006 - 12:21

6

[quote]
Rinominando il file il codice PHP non va comunque modificato in quanto l’htaccess punta al nuovo file.
[/quote]

Grazie per i complimenti.

Avrei dovuto dire “toccare il codice o rinominare i file” :)

Se il sito utilizza un “front controller” al massimo devi rinominare una pagina, se però hai diverse pagine da rinominare allora il metodo della variabile ti consente di ottenere il risultato senza essere invasivo

# - postato da Fabio Sutto - 10 Ottobre 2006 - 12:43

7

Creative Commons:

http://www.cached.it/blog/php/.....sizionate/

# - postato da wtf - 10 Ottobre 2006 - 20:43

8

[quote]
Creative Commons:
[/quote]

Ciao,
grazie per l’interesse ma apprezzerei che risultasse la provenienza (questo blog) e l’autore originario: oltre che essere richiesto dal creative commons sarebbe anche segno di gentilezza da parte tua :)

# - postato da Fabio Sutto - 10 Ottobre 2006 - 21:08

9

Il blog e l’articolo non sono miei, segnalavo soltanto il copia e incolla.

# - postato da wtf - 10 Ottobre 2006 - 22:38

10

Vabbè… Almeno citare le fonti dai!!!

# - postato da Napolux - 11 Ottobre 2006 - 09:40

11

@wtf

grazie della segnalazione allora, chiederò spiegazioni al Sig. Stefano Loberti di cached.it o segnalerò la cosa a Cesare che gestisce questo blog.

# - postato da Fabio Sutto - 11 Ottobre 2006 - 09:58

12

Come già detto via mail all’autore di questo blog non conoscevo l’origine di tale articolo in quanto parecchi post pubblicati li ricevo via mail.

Cmq rimosso e sono dispiaciuto dell’accadduto

# - postato da Stefano Loberti - 11 Ottobre 2006 - 10:24

13

Grande tip! Ma posso applicare lo stesso sistema anche in Windows con ISAPI REWRITE o Qwerksoft IIS Rewrite senza creare Loop?

# - postato da Alex Rimini - 11 Ottobre 2006 - 11:40

14

@Alex

certamente sì :)

# - postato da Fabio Sutto - 12 Ottobre 2006 - 09:57

15

ciao,
io ho un problema del genere…una riga che vado a riscrivere va in loop, ho seguito la guida ma l’errore è ora “internal server error” non conoscendo benissimo la sintassi per l’htaccess. La mia pagina ha due variabili pagina.php?var1=$1&var2=$2
qulcuno sa aiutarmi? grazie mille!

# - postato da Arturo - 19 Dicembre 2006 - 12:18

Inserisci il tuo commento:





(puoi usare i seguenti tag HTML per formattare il testo -
a href, b, i, br/, p, strong, em, ul, ol, li, blockquote, pre):

 

Anteprima del commento