26
URL rewrite e .htaccess: nozioni ed esempi
Postato da regole-seo, in Approfondimenti SEO
Conoscere e mettere in pratica l’url rewrite. [Parte 2 di 2]
Vai alla prima parte » Url rewrite
Nello scorso articolo abbiamo visto cosa è l’url rewrite e le differenze tra url rewrite e redirect 301 per capire in quali casi conviene usare uno o l’altro, visto che spesso c’è chi li confonde.
Non ci resta che vedere come si realizza l’url rewrite, tramite modulo mod_rewrite di Apache e un po’ di esempi su come utilizzarlo per risolvere alcuni tra i problemi più classici.
Il modulo mod_rewrite di Apache è un modulo che fornisce un potente mezzo per la manipolazione delle url. Tramite il mod_rewrite è possibile ottenere qualsiasi tipo (o quasi) di manipolazione degli indirizzi. Questo in molti casi implica uno sforzo non indifferente da parte di chi dovrà scrivere le regole di rewrite, spesso molto complicate.
Nello scrivere queste regole è sempre importante essere certi della loro correttezza, poiché un cattivo uso potrebbe causare dei problemi al funzionamento dell’applicazione e al server che la ospita.
Prima di vedere alcuni esempi di regole da inserire nel file .htaccess occorre sapere cosa sono le Rewrite Conditions e le Rewrite Rules.
Rewrite Conditions
Realizzata dalla direttiva RewriteCond definisce una regola condizionale.
La RewriteRule che segue una o più RewriteCond viene applicata solo se la url richiesta al server corrisponde al pattern della RewriteRule stessa e se tutte le RewriteCond precedenti sono verificate.
Come vedremo negli esempi è possibile appendere a ogni RewriteCond i seguenti flag, separati da una virgola in caso siano più di uno:
- [NC] fa si che il pattern della RewriteCond sia valutato in modalità case insensitive
- [OR] utilizzato per valutare in OR logico due RewriteCond consecutive.
Rewrite Rules
Realizzata tramite la direttiva RewriteRule, si occupa di definire il rewrite effettivo.
Anche in questo caso dunque è possibile appendere i seguenti flag separati eventualmente da una virgola:
- [R] redirige la url invocata ad un indirizzo esterno al nostro dominio inviando un response code 302 (MOVED TEMPORARILY).
- [F] proibisce l’accesso alla url invocata restituendo un response code 403 (FORBIDDEN).
- [G] definisce la url invocata come non più presente restituendo un response code 410 (GONE).
- [L] forza il processo di rewrite a fermarsi e a non considerare le regole di rewrite successive.
- [P] identifica la url come una richiesta al proxy passando il controllo al modulo mod_proxy.
Espressioni regolari
Per comprendere il funzionamento dei pattern usati nelle nostre regole per identificare le url occorre conoscere la sintassi delle espressioni regolari.
Qui di seguito mi limiterò ad elencare solo alcuni punti chiave per la comprensione delle espressioni regolari usate negli esempi.
Esiste molto materiale sul web realivo alle espressioni regolari e a questo sito
http://www.devarticles.com/c/a/ASP/The-Complete-Regular-Expression-Guide/
potete trovare una guida che può essere un buon punto di partenza.
- Identificatori di testo:
. qualsiasi carattere
[abc] a, b oppure c
[^abc] né a, né b né c
abc|def abc oppure def - Quantificatori:
? 0 o 1 occorrenze dell’identificatore di testo precedente
* 0 o N occorrenze dell’identificatore di testo precedente (N>0)
+ 1 o N occorrenze dell’identificatore di testo precedente (N>1) - Raggruppamento:
(identificatori di testo) le parentesi tonde sono un modo per identificare un gruppo di identificatori di testo come una singola unità atomica. - Ancore:
^ inizio linea
$ fine linea - Escape:
\ esegue l’escape del carattere che segue - Negazione:
è possibile eseguire la “negazione” di un determinato pattern facendolo precedere dal carattere punto esclamativo !
Non resta che vedere qualche esempio delle regole di rewrite da inserire nel file .htaccess situato nella root del nostro sito per andare incontro ad alcune classiche esigenze.
Esempi di regole di rewrite per esigenze classiche
Va detto che perché le regole di rewrite funzionino il modulo mod_rewrite di Apache deve essere abilitato all’interno del file httpd.conf della configurazione di Apache. A questo indirizzo
http://www.mrwebmaster.it/apache/articoli/guida-pratica-modulo-rewrite-apache_819.html
potete trovare un’ottima guida su come abilitare il mod_rewrite di Apache.
NOTA: per ragioni di spazio alcune linee di codice molto lunghe che definiscono le regole vanno inevitabilemnte a capo. Per questo motivo accanto ad ogni riga effettiva ho inserito il numero di riga (Es: 1-)
- Realizzare url più brevi e SEO-friendly
Spesso per vincoli implementativi dipendenti anche dalle tecnologie utilizzate ci troviamo di fronte ad url troppo lunghe e poco seo-friendly. E’ allora opportuno (prima della messa on-line per evitare problemi di duplicazione dei contenuti) adottare opportune regole come la seguente:1- RewriteEngine On
2- RewriteRule /prodotti/([a-z]+)/([0-9]+).html http://www.MioDominio.com/
gestione_prodotti/prodotti.action?categoria=$1&idProdotto=$2 [L]
Questo ci permette di ottenere una url più breve e amichevole sia per gli utenti che per i motori di ricerca.
Da notare alcune cose:
Innanzitutto non bisogna appendere alla prima parte dell’istruzione il nome del dominio (http://www. MioDominio.com). Infatti occorre inserire l’indirizzo a partire dalla root del sito (/).
Ricordo inoltre che nel caso di nomi di file contenenti degli spazi (cosa sempre altamente sconsigliata:)) occorre utilizzare i doppi apici per definire l’indirizzo.Le espressioni ([a-z]+) e ([0-9]+) indicano una porzione variabile della url che può contenere una qualsiasi serie di lettere nel primo caso e una qualsiasi serie di numeri nel secondo. Queste variabili verranno usate per realizzare la rewrite.
Infatti il simbolo $ seguito da un numero ($1 e $2 nel nostro caso) utilizzato nella parte destra della nostra regola serve per richiamare (posizionalmente) tali variabili presenti nella parte di sinistra.Dunque avremmo che la url SEO-friendly da esporre sarà ad esempio http://www.MioDominio.com/prodotti/casa/150.html e grazie alla rewrite rule genererà in realtà il contenuto della url http://www.MioDominio.com/gestione_prodotti/prodotti.action?categoria=casa&idProdotto=150
- Proteggere file e immagini
Talvolta alcuni webmaster espongono il link diretto al download di un file situato sul nostro sito o ad un’immagine presente su una nostra pagina web.
Con le seguenti regole la richiesta viene rediretta a http://www.MioDominio.com/ se la chiamata non proviene da http://MioDominio.com, http://www.MioDominio.com o http://62.149.140.1591- RewriteEngine On
2- RewriteCond %{HTTP_REFERER} !^$ [NC]3- RewriteCond %{HTTP_REFERER} !^http://MioDominio.com [NC]4- RewriteCond %{HTTP_REFERER} !^http://www.MioDominio.com [NC]5- RewriteCond %{HTTP_REFERER} !^http://62.149.140.159 [NC]6- RewriteRule ^.*$ http://www.MioDominio.com/ [R,L]
- Domini differenti per lo stesso sito
In alcuni casi lo stesso sito deve essere accessibile da url differenti come ad esempio MioDominio.com e www.MioDominio.com.
Con la seguente regola di rewrite una url come http://MioDominio.com/about.html si risolverà come un’effettiva chiamata alla url http://www.MioDominio.com/about.html.1- RewriteEngine On
2- RewriteCond %{HTTP_HOST} !^MioDominio.com$ [NC]3- RewriteRule ^(.*)$ http://www.MioDominio.com/$1 [R,L]
NOTA: nel caso di più domini che corrispondano allo stesso sito tenete sempre ben presente gli eventuali problemi di duplicazione dei contenuti. - Rewrite del dominio su una directory
Se si ha la necessità di fare rispondere una specifica directory all’invocazione del dominio è possibile usare la seguente regola:1- RewriteEngine On
2- RewriteCond %{HTTP_HOST} ^www.MioDominio.com$3- RewriteCond %{REQUEST_URI} !^/miaDirectory/4- RewriteRule ^(.*)$ /miaDirectory/$1
In tal caso l’invocazione del dominio http://www.MioDominio.com si risolve in una chiamata alla url http://www.MioDominio.com/miaDirectory/ - Visualizzare i contenuti opportuni in base allo user agent
Se doveste avere la necessità di mostrare dei contenuti sulla base dello user agent dell’utente potete servirvi di una regola di rewrite simile alla seguente:1- # MS Internet Explorer - Mozilla v4
2- RewriteEngine On
3- RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4(.*)MSIE4- RewriteRule ^index\.html$ /index.IE.html [L]
5-
6- # Netscape v6.+ - Mozilla v5
7- RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5(.*)Gecko8- RewriteRule ^index\.html$ /index.NS5.html [L]
9-
10- # All other browsers
11- RewriteRule ^index\.html$ /index.default.html [L]
In questo caso, invocando la url http://www.MioDominio.com/index.html, se il campo User-Agent dell’ http header della richiesta inizia con “Mozilla/4″ e si tratta di Internet Explorer (MSIE), allora sarà eseguita una rewrite sulla pagina http://www.MioDominio.com/index.IE.html (e non verranno considerate le regole successive).
Se invece il campo User-Agent inizia con Mozilla/5 e si tratta di Netscape (Gecko), sarà eseguita la rewrite su http://www.MioDominio.com/index.NS5.html
Infine, per tutti gli altri browser verrà eseguita la rewrite alla url http://www.MioDominio.com/index.default.html
Per concludere ecco il link alla documentazione del modulo mod_rewrite di Apache.
Vai alla prima parte » Url rewrite


Ciao, grazie alla tua guida finalmente sono riuscita a capire come creare un file htaccess che rispondesse all’indirizzo www.miosito.it e reindirizzasse la richiesta all’indirizzo www.miosito.it/subdirectory (ho usato le istruzioni del paragrafo “Rewrite del dominio su una directory”)
Solo un dubbio, nel file htaccess che risponde all’indirizzo www.miosito.it posso inserire le sole righe del paragrafo suddetto e lasciare poi al file htaccess contenuto in “subdirectory” tutte le altre istruzioni?
Spero sia chiaro quello che ti sto chiedendo
Ciao e grazie!
Ciao Fra.
Certo che puoi, anzi è il modo più classico di utilizzare i file .htaccess.
Complimenti per il post, al quale sono arrivato cercando di risolvere un bubbio che ancora mi rimane:
posso mettere due redirect diversi uno dietro l’altro nello stesso file htaccess?
Spiego meglio: ho una prima riga che mi fa redirect da www.sito.index.php a www.sito.it
e poi una seconda che redirige http:/sito.it su www.sito.it
—–
RewriteEngine ON
RewriteRule ^/index.php$ http://www.xprenotare.it/ [R=301,L]
RewriteCond %{HTTP_HOST} ^xprenotare.it [NC]
RewriteRule ^(.*)$ http://www.xprenotare.it/$1 [L,R=301]
——
Apparentemente tutto sembra funzionare, ma il dubbio su come la prenderanno i motori di ricerca (google)
Grazie
Ciao Gregorio.
Di fatto stai implementando la redirezione di due url differenti verso una terza url.
Stai cioè comunicando ai motori che i contenuti di due indirizzi A e B sono i medesimi e che devono essere fruiti dall’indirizzo C.
E’ il modo corretto di fare le cose.
Google indicizzerà C ed eviterai problemi di dupplicazione dei contenuti.
Eventualmente tieni monitorati i risultati di ricerca e sfrutta webmastertools per identificare eventuali problemi identificati dallo spider.
Spero di aver risposto alla tua domanda.
Sembrava funzionare, almeno per gli umani funziona, ma google dopo una settimana è riuscito a entrare lo stesso e scaricare il file robots.txt
Scusa Gregorio, ma non ti seguo.
Ora stai parlando del robot.txt mentre prima del reindirizzamento di due url.
…purtroppo così non è facile dedurre il tuo reale problema e ciò che ti serve fare.
Con quei redirect stai suggerendo a Google che la url da indicizzare è una sola.
Ciao Fra, hai ragione, chiarisco meglio.
Da Google Strumenti per Webmaster ho registrato il sito nelle due versioni, con e senza www, e ho indicato quale è il dominio preferito.
Dopo aver fatto ciò, avendo notato che il crawler visitava ugualmete il dominio senza www, anche se meno frequentemente, e aggionava pure le statistiche, nel timore di una penalizzazione per contenuti duplicati ho pensato di risolvere il problema alla radice: mettere un redirect 301 da senza a con www prendendo spunto dal tuo articolo sopra.
Ora la cosa funziona bene e mi piace molto come lo fa, perchè facendo delle prove di digitazione non solo reindirizza al sito desiderato se scrivo senza www ma anche se scrivo per errore con una sola w con 2 o con 4. E questo è bene. Infatti terrò comuque in funzione questo Redirect. Però non ancora risolto il mio scopo iniziale: che anche ilcrawler di goole venga reindirizzato al sito con www.
Copio inollo sotto le due righe del redirect cosi si capisce come l’ho adattato e cosa mi aspetto, e prima che tu melo chieda:)
Grazie e buona domenica!
RewriteCond %{HTTP_HOST} ^xprenotare.it [NC]
RewriteRule ^(.*)$ http://www.xprenotare.it/$1 [R=301,L]
Ciao.
Quello che ti posso dire è questo.
Io ho implementato un redirect tra domini differenti (da A a B).
In google webmastertools vedo comunque che il crowler ogni tatno passa a visitare anche il dominio A (molto raramente).
Questo però non vuol dire che lo indicizza.
Quello che hai fatto per implementare il redirect mi sembra corretto.
Il mio consiglio è di controllare ogni tanto l’indicizzazione del tuo sito per vedere se il dominio che scatena il redirect piano piano esce dalla SERP.
Se è così non dovresti temere problemi di dupicazione.
salve a tutti! premetto che non ci capisco molto di .htacces.
sul mio sito avrei bisogno di riscrivere un url da www.nomesito.com/home.php in www.nomesito./home
poichè il sito è avviato da parecchio mi sembra di capire che dovrei preferire un redirect 301 è corretto?
come posso eseguire questa operazione per ottenere il risultato espresso sopra? grazie!
Ciao Wiizard.
Si, visto che il tuo sito è avviato da tempo ciò che devi fare è una redirect in modo che il valore guadangato nel tempo della tua vecchia url venga trasferito alla nuova.
Per fare quello che dici devi usare questa regola:
Redirect 301 /home.php http://www.mioSito.com/home
Ti consiglio comunque di dare un’occhiata a questo paragrafo:
http://www.regole-seo.com/redirect-301#htaccess-301-redirect
ciao,
è possibile utilizzare questo metodo su tutto il sito,
mi spiego meglio ho diverse pagine avv.php?id_pro=1 , news.php?id_pro=2, ecc.
E’ possibile stabilire un rewrite su diverse pagine, fare una cosa del genere:
RewriteEngine on
RewriteRule ([^/]+).html$ avv.php?url=$1 [L]
RewriteRule ([^/]+).html$ news.php?url=$1 [L]
Grazie.
Salve, ho letto la buona guida, ma non riesco ad effettuare il rewrite dell’url in maniera corretta.
Mi spiego, ho una forma con 4 campi
citta
comune
tipologia
voglio creare degli url in base alla query string passata.
ho scritto la seguente regola
RewriteRule ^([^-]*)-([^-]*)$ ricerca_avanzata.php?provincia=*&VF=$2&tipologia=$1&superficie=*&NRIF=&submit2=VAI [L]
in modo da avere i nomi divisi dal trattino. ma non funziona nel caso in cui specifico solo 2 dei valori della query string.
forse devo mettere delle regole di condizione?
Grazie
Per Gino: si è possibile. Ti consiglio di leggere bene la documentazione che ho segnalato a fine articolo.
In generale, per rispondere anche a Manolo, quando occorre creare delle regole complesse è possibile affidarsi a dei software che verificano il match tra una stringa passata e una regular expression stabilita.
È una cosa che faccio speso anche io quando devo trovare una regola particolare