26
URL rewrite e .htaccess: nozioni ed esempi
Postato da regole-seo, in Approfondimenti SEO, in data 26/07/2010
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:
11- RewriteEngine On
12- RewriteRule /prodotti/([a-z]+)/([0-9]+).html http://www.MioDominio.com/1gestione_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.15911- RewriteEngine On12- RewriteCond %{HTTP_REFERER} !^$ [NC]13- RewriteCond %{HTTP_REFERER} !^http://MioDominio.com [NC]14- RewriteCond %{HTTP_REFERER} !^http://www.MioDominio.com [NC]15- RewriteCond %{HTTP_REFERER} !^http://62.149.140.159 [NC]16- 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.11- RewriteEngine On12- RewriteCond %{HTTP_HOST} !^MioDominio.com$ [NC]13- 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:11- RewriteEngine On12- RewriteCond %{HTTP_HOST} ^www.MioDominio.com$13- RewriteCond %{REQUEST_URI} !^/miaDirectory/14- RewriteRule ^(.*)$ /miaDirectory/$1In 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:11- # MS Internet Explorer - Mozilla v412- RewriteEngine On13- RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4(.*)MSIE14- RewriteRule ^index\.html$ /index.IE.html [L]15-16- # Netscape v6.+ - Mozilla v517- RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5(.*)Gecko18- RewriteRule ^index\.html$ /index.NS5.html [L]19-110- # All other browsers111- 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
ciao io ho un problema un plugin che mi serve mi dice questo nelle istrizuoni:
Now change the URL in the .htaccess file in the above configured $sitename URL (RewriteRule ^(.*) http://www.yourdomain.com/?%1 [L]).
ma non riesco a capire cosa devo fare mi aiuti per favore? grazie
Bhe… …mi pare abbastanza chiaro.
Le istruzioni ti dicono di modificare il file .htaccess… ….riferendosi a qualcosa detto in precedenza nelle istruzioni stesse.
[...] Per approfondire il discorso sul file .htaccess, questi snippet di codice ti serviranno per rendere più sicuro il tuo blog, ma anche per migliorare le prestazioni in termini di [...]
Salve io ho fatto tutto quello che dite, e url mi esce solo che c’è un grande problema. Quando lancio l’url mi esce la pagina ma non mi richiama nella pagina i vari include() i file css e le immagini :S. Come posso risolvere?? grazie mille
Ciao Giuseppe.
Cosa intendi con “non mi richiama”?
Vengono richiamati e generano un 404 o un errore server?
O proprio non vengono effettuate ke chiamate http?
Ciao, se dovessi fare in modo che tutti gli url del tipo :
nomedominio.com/?action=zoom&format=print&id=265&lang=it&method=news
Fossero rimandati ad una pagina specifica ad esempio
nomedomino.com/sitemap.html
Cosa dovrei scrivere come regola?
Dipende da cosa intendi per “tipo”.
La seguente espressione redirige tutte le url
“nomedominio.com/?”
seguite da qualsiasi stringa, alla sitemap.
RewriteRule /\?(.*) http://nomedomino.com/sitemap.html [R=301,L]
Non so di preciso perchè ti serva fare questa redirezione.
Io la sconsiglierei visto che anzichè dire a Google che quelle pagine non esistono, gli stai dicendo che sono la tua sitemap.
Ciao,
grazie per il tuo interessante articolo. Io sto cercando di applicare URl rewriting correttamente nel mio sito, ma se applico la seguente regola nel file .htaccess:
RewriteRule ^URL-SEF.php$ url-non-sef.php [L,R=301]
il risultato è che l’URL diventa 404 not found…dove sto sbagliando?
Ciao Isotopia.
Se la risposta è 404 significa che la url di destinazione non è corretta (anche se la chiami direttamente, cioè senza passare dal redirect ottieni un 404).
Sei sicura che la url di destinazione sia corretta e che il file esiste?
Eventualmente posta la url.
Grazie,
infatti è vero, l’URL di destinazione non esiste. Ma allora come faccio ad istruire il browser per un rewriting + redirect? Mi spiego: ho una urlnonseo.php, la voglio far diventare URL-seo.php. Dunque scrivo in .htaccess una regola del tipo:
RewriteRule ^URL-seo.php$ urlnonseo.php [L].
Fin qui tutto ok, il rewriting funziona e il brwoser mi mostra la pagina con la nuova URL-seo.php. Però ora ho un nuovo problema, ossia ho due pagine identiche urlnonseo.php e URL-seo.php con contenuti duplicati. urlnonseo.php è indicizzata, url-SEO.php no. Dunque io vorrei fare un rewriting + redirect, in modo che:
- Il browser mostri URL-seo.php
- Google consideri solo URL-seo.php e ignori urlnonseo.php
- Il rank di urlnonseo.php venga trasferito a URL-seo.php
Ho provato con le seguenti regole da .htaccess:
RewriteRule ^Url-seo\.php$ /urlnonseo.php [L,R=301]
Il risultato è che il redirect funzia, ma non il rewriting: il browser continua a farmi vedere la URLnonseo.php
Ho provato anche con la regola inversa:
RewriteRule urlnonseo\.php$ /URL-seo.php [L,R=301]
Il risultato è che il browser mi fa ora vedere URL-seo.php ma la pagina risulta 404 Not found (appunto perchè in realtà non esiste, è solo l’URL finta con cui voglio rinominare l’URL vera).
Come posso ottenere il mio scopo secondo te?
Supponendo che tu attualmente abbia la pagina
urlnonseo.php
sul tuo server devi:
- Creare la pagina URL-seo.php (copia dell’attuale urlnonseo\.php)
- Rimuovere la vecchia urlnonseo\.php (puoi anche non rimuoverla ma di fatto non ti servirà più a nulla)
-Inserire nel tuo .htaccess la regular expression che attualmente ti genera un 404 perchè la pagina su cui redirige non esiste ovvero
RewriteRule urlnonseo.php$ /URL-seo.php [L,R=301]
In pratica la regola di redirect è giusta ma non hai creato la nuova pagina di destinazione
come si fa a fare questo redirect?
DA /dir/nome_senza_punto A index.php
ho provato il codice sotto ma mi fa il redirect anche dei nomi di file con il punto dentro la cartella dir… dove sbaglio??
RewriteRule ^dir/([^\.]) /index.php [R=301,L]
ciao a tutti ragazzi,
io ho un problema.
Ho un sito con joomla nella root e un forum phpbb nella dir /phpbb.
Ho installato un secondo joomla nuovo nella dir /sito e ho fatto il redirect in htaccess per reindirizzare tutto nella dir /sito e funziona egregiamente.
Però a questo punto non riesco più a mettere un link al forum (www.xxxxx.it/phpbb) perché lui cerca il link in (www.xxxx.it/sito/phpbb)
Qualcuno sa come modificare htaccess per evitare che mi reindirizzi anche quando viene digitato o inserito l’url (www.xxxx.it/phpbb) ?
Grazie in anticipo!