Pubblico la guida, realizzata da Stefano Loberti, amministratore del forum di cached.it, per riscrivere gli url dinamici in url statici tramite il mod_rewrite, un modulo di apache che permette appunto di riscrivere gli url e renderli più search friendly, graditi ai motori dai ricerca.
Usare degli url statici (http://www.cached.it/parole-chiave/jacuzzi.htm) anzichè dinamici (http://www.google.it/search?hl=it&q … &meta=) ci può aiutare davvero tanto a dare maggiore visibilità al nostro sito. Le query string (appunto per i siti dinamici) vanno lasciate ai grandi siti (www.google.com, www.ebay.com etc etc), mentre per i piccoli o medi siti conviene appunto applicare tecniche di riscrittura degli indirizzi ed è questo una delle specifiche più comuni del modulo di apache chiamato appunto mod_rewrite.
Prerequisiti:
Come requisiti fondamentale per usare il mod_rewrite è appunto avere un web server Apache e poter avere accesso al suo file di configurazione (httpd.conf). Una veloce guida per configurare le opzioni del rewrite:
./configure --enable-module=rewrite --enable-shared=rewrite
Solitamente questa opzione va abilitata al momento della compilazione del web server altrimenti dovremo modificare il file httpd.conf in seguito. Vi riporto una soluzione per una particolare soluzione di configurazione:
<Directory /www/htdocs/yoursite> Options ExecCGI FollowSymLinks Includes MultiViews </Directory>
Se hai dei problemi ad abilitarti il mod_rewrite puoi provare ad usare AllowOverride All.
Planning
E’ davvero importante avere una idea e seguire una valida strategia su come vanno riscritti gli URL in quanto questi vanno riscritti solo prima della pubblicazione del sito e non si “dovrebbero” più cambiare. Questo perchè ? Perchè se noi abbiamo una query string (ad esempio notizie.php?id=14&cat=cronaca&city=roma) se noi la trasformiamo in statica (notizie/14/cronaca/roma/) abbiamo si creato un url statico ma abbiamo anche duplicato la pagina dinamica che continuerà ad esistere (in quanto fisicamente presente sul server) con quella appena riscritta. Dunque se il vostro sito è già indicizzato non andare ad applicare il rewrite ai vostri url (a meno che non siate davvero forti con ottimi inbound links).
Esempi di rewrite
Vediamo alcuni esempi di rewrite degli url:
Query String URL: http://tuosito.com/tutorials.php?req=tutorial&id=3&page=0 mod_rewrite URL: http://tuosito.com/tutorials/3/0.php
Ti sembra una cosa complicata far diventare un url di questo tipo ? No assolutissimamente.
Non dovrai far altro che creare un file chiamato .htaccess e caricarlo nella directory in cui si trova il file che andrai a riscrivere (in questo caso tutorials.php) e scrivere questa semplice regola:
RewriteEngine On RewriteRule ^tutorials/(.*)/(.*).php /tutorials.php?req=tutorial&tut_id=$1&page=$2
In questo esempio ci sono 2 righe di codice:
La prima RewriteEngine On che definisce l’inizio del rewrite engine, la seconda è la regola che andremo ad applicare al modulo di riscrittura.
RewriteRule ^tutorials/(.*)/(.*).php /tutorials.php?req=tutorial&tut_id=$1&page=$2
Questa è la prima regexp (espressione regolare) che abiliteremo per creare i nostri url google-friendly. Questa permette che tutto quello che noi scriveremo al posto di (.*) venga comparato con la seconda parte della nostra rule di rewriting. Il file .htaccess lavora appunto usando delle espressioni regolari. Infatti il primo (.*) sarà il valore $1 ed il secondo (.*) sarà il valore $2 della nostra conversione. Possiamo usare una serie infinita di concatenazioni di variabili in tutte le nostre applicazioni web.
Io incoraggio tanto l’utilizzo di questa funzionalità in quanto aiuta davvero molto nel posizionamento sui motori di ricerca e ci permette di salire nelle serp.
Vediamo ora nel dettaglio questa semplice regola :
RewriteEngine on RewriteRule ^notizia/([^/\.]+)/?$ index.php?notizia=$1 [L]
^notizia/
Questa sarà la nostra ex pagina dinamica strasformata in una sorta di directory (almeno è quello che vedranno utenti e motori di ricerca). Se non c’è questa condizione il rewrite sarà ignorato.
([^/.]+)
Questo serve a far capire al rewrite che il contenuto delle parentesi quadre [ ] sarà il valore della variabile che passiamo in “andata” tramite il nostro nuovo url
/?$
questo serve ad assicurarsi che l’unica cosa che trova dopo il valore passato sia appunto un forward slash (/)
index.php?page=$1
E’ l’attuale pagina con la query string (pagina dinamica)
[L]
Dice a Apache di non procedere ad un altro RewriteRules se questo riuscisse.
Fino ad ora tutto quello che ho detto e scritto potrebbe sembrarvi complesso ma in realtà tutto questo è semplicissimo.
Facciamo un esempio pratico:
Creiamo un file .htaccess con dentro la seguente regola
RewriteEngine On RewriteRule ^notizie/([^/]+).html notizie.php?id=$1 [L]
Ora creiamo un file che andremo a chiamare notizie.php con dentro il seguente codice:
<html>
<p>
La pagina richiesta è
<?php echo $_GET['id']; ?>
Ora carichiamo questi 2 file in una directory di prova (che io chiamerò test) del nostro web server e proviamo a richiamare il file notizie in questi 2 modi :
www.nostrosito.it/test/notizie.php?id=14
e poi
www.nostrosito.it/test/notizie/14.html
Se il risultato è 14 complimenti avete appena riscritto il vostro primo url !!!
Ora vi vado a scrivere un po’ di regole con gli esempi prima e dopo la riscrittura poi non dovrete fare altro che applicarli come avete appena fatto:
www.sito.it/catalogo.php?cat=occhiali&prodotto_id=1234
www.sito.it/catalogo/occhiali-1234.html
#start .htaccess code
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^cat\=([^&]+)\&prodotto_id\=([^&]+)$
RewriteRule ^$ /catalogo/%1-%2.html [R=301,L]
http://sito.it/it/blog
http://sottodominio.sito.it/it/blog
# questo .htaccess va messo nella root di www.sito.it
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://sottodominio.sito.it/$1 [R]
-------------------------------------------------
Guida Realizzata da Stefano Loberti
Pubblicata su questo sito per cortese concessione
di chached.it e del suo autore.
Visita Il Forum ufficiale di cached.it
[...] Vi rimando a una lettura all’articolo sul mod_rewrite per capire come riscrivere gli url del… [...]
[...] quello su come popolare una select dinamica,realizzata da max di mdlwork.com, pure la guida di Stefano Loberti sul mod_rewrite, prima di pubblicarli ho contattato gli autori e cheisto il permesso e poi ho specificato, nei [...]
RSS feed dei commenti a questo articolo. TrackBack URL
ciao,
interessante la guida!
mi chiedevo una cosa:
ho un sito web le cui pagine interne sono gestite da una index che tramite get prende l’ID della pagina e preleva così il contenuto.
Es. …/Sezione/?pagina=41 ->viene visualizzato il contenuto della pagina con id=41
Mi interessava sapere se potevo fare un rewrite affinchè prendessi alcune parole chiave dal db e costruire poi l’url riscritto, anzicchè la solita regola: …/sezione/41.html.
Si può fare?
Ciao SeoCosenza,
è possibile farlo, e sicuramente è molto gradito ai motori di ricerca mettere le parole chiavi direttamente nell’url.
se per esempio hai un campo nel database dove metti il titotlo di un articolo o post, potresti farlo apparire nell’url cosi:
RewriteRule ^([^/]+)/([^/]+).html$ articolo.php?p=$1&titolo=$2
dove p = l’ID, ti consiglio di metterlo in modo da avere una cronologia degli articoli, questo è gradito ai motori, e come seconda opzione metti il titolo.
alla fine avresti un url cosi:
http://www.nomesito.it/ID/titolo-articolo.html
Naturalmente dovresti usare uno stringreplace con php o asp per togliere gli spazi del titolo e mettere al loro posto un “-”.
un pò come avevo fatto io con il vecchio sito e come ho fatto anche adesso con la nuova versione.
Se hai dubbi chiedi
ciaoo
Grazie mille per la celere e utile risposta!
Ciao,
ho provato, ma non ne vuole sapere…
il mio .htaccess è questo
———————————————
RewriteEngine On
RewriteRule ^prova/([^/]+).html prova.php?category=$1 [L]
———————————————
prova.php
———————————————
<?php
echo ( “Category [".$_REQUEST['category'].”]” );
?>
———————————————
entrambi dentro la cartella http://www.miosito.com/web/test/
ed io provo ad accedere con gli indirizzi
http://www.miosito.com/web/test/prova.php?category=action
http://www.miosito.com/web/test/prova/action.html
Il primo funziona e il secondo mi da un 404.
Dove sbaglio??
Grazie mille!!
Come non detto… ora funziona… era un problema di Apache:
nell’ httpd.conf avevo la DocumentRoot con AllowOverride None e quindi non considerava quello scritto in .htaccess.
Ciao,

scusa se non ho risposto ma sono dal lavoro.
Vedo che hai risolto, bene, in effetti il tuo htaccess era normale e corretto, meglio cosi.
Ciaoo
ciao, io ho un problema che non capisco, ho seguito alla lettera il tutorial (a proposito, complimentissimi) e arrivo quasi in fondo al primo test ma….
-la pagina php funziona regolarmente e scrive “La pagina richiesta è 14″
-la pagina html non si può dire che non funzioni perchè in effetti un risultato lo fornisce, ovvero scrive “La pagina richiesta è”. Sembrerebbe non riuscire a leggere la parte da utilizzare come variabile… dove può stare il problema?
Grazie anticipatamente
Max
ah,a proposito, il contenuto dei file è assolutamente quello del tutorial, ho usato copia/incolla, ma nel dubbio ve lo trascrivo lo stesso:
–file .htaccess–
RewriteEngine On
RewriteRule ^notizie/([^/]+).html notizie.php?id=$1 [L]
–file notizie.php–
La pagina richiesta è
Ciao Max, se hai fatto copia e incolla occhio alle virgolette nella parte:
< ?php echo $_GET['id']; ?>
Potrebbe darti errore per questo, se il resto è ok, quando richiami la pagina :
http://www.nostrosito.it/test/notizie/14.html
ti richiama la giusta pagina? se e si prova ascrivere di nuovo il codice php senza copiarlo, potrebbe essere un problema del copia e incolla,spesso le virgolette le riporta male, gia e successo altre volte.
Se non ti da la pagina allora potrebbe essere il tuo htaccess o probabilmente non hai il mod_rewrite abilitato nel tuo httpdconf di apache.
Prova e fammi sapere.
risolto, il problema era che quando avevo settato il file httpd per AllowOverride non mi ero accorto che ci sono svariati AllowOverride e avevo dato “all” a quello sbagliato.
Ho sistemato quello giusto e tutto va perfettamente! Grazie mille.
Per conoscenza riporto di seguito le righe dove si trova il “AllowOverride” giusto… sperando di risultare utile
———————————
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be “All”, “None”, or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride All
#
# Controls who can get stuff from this server.
# . /
Grazie a te per la condiviire la soluzione, potrebbe essere utile anche a altri.
Salve,
purtroppo sono incappato in un hosting abbastanza “pessimo” ed ho un piccolo problema:
tutte le pagine senza “www” non vengono caricate.
Allora ho fatto questo:
Ho rediretto i DNS * e @ del mio sito sul mio ip statico dove sta in esecuzione xampp always on così da intercettare le richieste, e poi ho fatto una index.php che mi trasforma le richieste senza www in richieste con www tramite il codice:
php $server = $_SERVER['SERVER_NAME']; header(‘Location: http://www.‘ . $server);
putroppo non funziona come dovrebbe (a volte va, altre no).
A me servirebbe un “redirect wild card” da “http://sito.ext/*” a “http://www.sito.ext/*” per qualunque valore di * in PHP (file, sottocartelle, variabili), ed ho a disposizione tutto apache per farlo, ma non so come.
Mi potete aiutare?
Sarebbe una grande cosa se potesse essere “indipendente” dal dominio, cioè ogni richiesta del tipo sito1.ext, sito2.ext… si trasformi automaticamente in http://www.sito1…, anche se la cosa non è fondamentale.
Grazie.
Dimenticavo: ovviamente il sito NON si trova sul mio pc, devo solo “reindirizzare” la richiesta.
ho riscritto le mie pagine con il metodo mod rewrite.
Tutto Ok. Ma la pagina riscritta miosito.it/pagina1/ non riesce ne a settare ne a leggere i cookie. la pagina reale miosito.it/pagina.php?id=1 invece si
Come mai ?
grazie
Cri
Ciao Cristiano,
non saprei dirti cosi, forse il percorso dei cookie cambia in relazione al nuovo indirizzo.
magari prova a postare il codice.
Ma a spostarlo dove ?
ma possibile che nessuno ha qst problema ?
A Te non risulta che i cookie hanno dei problemi ?
Ciao Cristiano,
il mod_rewrite non ce’ntra nulla con i cookie, a meno che tu non abbia un tuo script che usa i cookie, li setta e li salva in una determinata posizione, a quel punto cambia il link perche il tuo indirizzo cambia pure:
se il cookie si trova in :
http://www.sito.it/cookie/
cambiando la riscrittura dell’url potrebbe cambiare anche il percorso.
PRova contattare il tuo hosting, magari il mod_rewrite del tuo hoster ha qualche limitazione.
@MTBVulture,
tu esegui un redirect con php, devi eseguirlo con htaccess, modifichi direttamente oppure potresti anche fare un virtualhost direttamente con apache modificando il config.
ti rimando a questa guida
http://httpd.apache.org/docs/1.3/mod/core.html#virtualhost
e abbastanza semplice da configurare e sei sicuro che funziona sempre.
Si è un problema di path del cookie
Ciao,
ottime indicazioni.
Però io mi ritrovo un problemino e in rete non sono ancora riuscito a trovare una soluzione.
il fatto è che la mia querystring è così formata per es:
prova.php?titolo=prova in rete
e voglio che venga reindirizzata su prova/prova-in-rete/
Ossia che gli spazi vengano trasformati in “-”
Come fare nell’htaccess?
Grazie
Alessandro
Ciao Alessandro, devi farlo con php,usare string replace:
http://es2.php.net/str_replace
per riempire gli spazi vuoti e inserirli nel link, non so se con htaccess lo puoi fare, ma e consigliabile direttamente da php.
dai un occhiata al link, è molto semplice da usare lo str_replace.IO nei miei siti ho sempre fatto cosi.

Ciao
Ciao,
nell’htaccess mi sa che non può.
Solo che ho delle pagine già indicizzate con parole con lo spazio…
Tu come hai fatto in questi casi?
ciao
Alessandro
Redirect 301.
http://www.antoniofullone.it/articoli/263/redirect-301-sugli-indirizzi-web/
Ciao a tutti, la guida è molto interessante, tuttavia dopo aver applicato queste regole ho notato che google mi restituisce un 404 sugli indirizzi riscritti. nel senso che le pagine si possono navigare tranquillamente ma negli strumenti per webmaster di google mi segnala che le suddette pagine non sono raggiungibili. Cosa potrebbe essere? questo è il mio htaccess:
php_flag register_globals On
ErrorDocument 404 /404.html
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^dominio.com [NC]
RewriteRule ^(.*)$ http://www.dominio.com/$1 [L,R=301]
RewriteRule ^([0-9]+)/([a-zA-Z0-9_-]+).html$ cat.php?id=$1&name=$2 [L]
RewriteRule ^video/([0-9]+)/([^/]+).html$ video.php?id=$1&title=$2
Ciao Frank, prova a aspettare un po per vedere al prossimo passaggio del bot di google cambia qualcosa, importante che le pagine funzionino.
ciao,
bella la guida ed ottimi i consigli
ho un problemino che non capisco, non sono molto pratico.
Ho un sito in php ma senza database
ecco un esempio dell’index :
switch($link_da_includere)
{case 0:$pagina = “blabla.htm”; break;
case 11:$pagina = blabla2.htm”; break;
case 14:$pagina = blabla3.htm”; break;
case 1: $pagina = “blabla4.htm”;break;
ho fatto un htaccess con questa regola:
RewriteEngine On
RewriteRule ^blabla/([^/]+).htm index.php?link=$1 [L]
non funziona e non so perchè…
grazie
Stefano
e ativato il modulo rewrite sul tuo server?
il codice sembrerebbe corretto.
Chi mi aiuta a risolvere questo problema ?
http://www.giorgiotave.it/forum/mod-rewrite-e-tecniche-di-url-redirect/114180-redirect-permanent-non-funziona.html
Ciao Antonio,
ho trovato il tuo articolo molto interesante perchè ho proprio un problema con il Mod Rewrite
volevo capire se fosse possibile modificare le URL delle singole Pagine Web di un sito Creato in Php.
Il sito in questione è un portale di annunci ed al momento la URL del singolo annuncio è:
http://www.mrannunci.it/?regione=campania&pag=vediannuncio&idannuncio=1
e vorrei poterla modificare in:
http://www.mrannunci.it/annunci-campania/Mouse-Logitech-MX-Revolution-Nuovo
è possibile effettuare un’operazione del genere ??
Grazie in anticipo della tua disponibilità
@Luigi : puoi farlo senza problemi, ma ti serve php per ricreare gli url, e passare le variabili come regione e id.
Ciao Antonio,
ma è un’operazione complessa ???
Te lo chiedo poichè non sono molto pratico di linguaggio Php, al limite è una cosa che potresti fare tu (pagando naturalmente) ?
Poichè il sito in oggetto è ultimato ma purtroppo ha questo problema delle URL che penso non sia da trascurare, infatti le varie URL così come sono non verrebbero proprio prese in considerazione da Google e sarebbe proprio un peccato.
Se vuoi possiamo anche continuare via mail in privato!
Mi spiace ma in questo periodo proprio non avrei il tempo materiale
Quello che posso consigliarti, anche per non spendere soldi e chiedere in qualche forum, come ha fatto qualcuno nei commenti precedenti.
Te ne consiglio due :
http://www.yourinspirationweb.com/forum/
giorgiotave.it/forum
Ok seguirò il tuo consiglio, grazie comunque per la disponibilità
Scusa Antonio volevo capire una cosa, come suggerivi tu, cioè ricreare le URL, non ci si avvale allora del Mod Rewrite ???
Si andrebbe a ricreare le URL da capo giusto ???
Luigi : mi ero dimenticato di indicarti il sito principale dell’autore del tutorial, che non sono io ma Stefano Loberti di chached.it
il forum lo trovi qua :
http://forum.cached.it/forum/
cmq se leggi e egui questo tutorial già puoi capire come fare,php ti serve poi per riscrivere tutti i link. se prima un link puntava a
http://www.mrannunci.it/?regione=campania&pag=vediannuncio&idannuncio=1
ora deve cambiare per il nuovo url e se le variabili regione,pag e idannuncio sono dinamiche, cioè provengono da un database, allora devi sapere usare php per poter cambiare gli url.
Ti ripeto purtroppo ho poco tempo in questo periodo a disposizione, altrimenti ti aiuterei volentieri
Se vuoi posso consigliarti, in privato, qualcuno che puoi contattare se proprio non riesci a risolvere il problema.
antonio.fullone [at] gmail . com
ciao!
ciao a tutti…io ho un problema..o meglio non mi è chiara una cosa,
sry
Dicevo..non mi è chiara una cosa..
Ho un sito già attivo e funzionante…avevo in mente di attivare il mod_rewrite ma mi spiegate 2 cose?
1- posso usare il mod_rewrite anche se ormai sul sito ho riferimenti fatti in un certo modo?mi riferisco a css &c. perchè facendo un mod rewrite qui http://www.nightchannel.it/index.php?sel=music (scrivendo http://www.nightchannel.it/homepage/music) non vedo le immagini e gli stili del CSS..come mai?dovrei rifare tutti i riferimenti?
2- se vado su http://www.nightchannel.it/index.php?sel=music , facendo il mod rewrite, non si può fare in modo che l’url diventi quello riscritto?
2bis- a proposito un Off Topic, nel mio .htaccess ho messo un redirect alla pagina index.php nel caso in cui si verifichi un 404 o un 403 però la url rimane quella digitata male (nel caso di un 404)..non si può cambiare mettendo index.php?
Spero di essermi stato chiaro…
In ogni caso complimenti per il post…molto chiaro!
Grazie
Francesco :
puoi fare tutte e 3 le cose, prova a chiedere nel forum di Stefano cached.it, è lui l’autore della guida
Volevo chiederti se è possibile fare una cosa del genere:
Ho due domini, e voglio usare htaccess per mostrare la stessa cosa, ma con una variabile in più.
Es:
su dominio1.it mostro il sito originale
su dominio2.com mostro le stesse cose, ma con la variabile ?lang=en alla fine di ogni link, ma non voglio che questo sia visibile, ovvero vorrei che si vedesse dominio2.com come url, ma la pagina visualizzata fosse dominio1.it?lang=en
Non so se sono riuscito a spiegarmi…
ma per caso c’è un modo per far gestire anche la cache al mod_rewrite? io cel’ho abilitato sul sito e da quel che ho capito non posso più tornare indietro altrimenti avrei ulteriori url doppi ( ne ho già un bel probabilmente creati durante la costruzione avvenuta online ), ma da quel che ho capito non posso usare il caching del browser con questo modulo… confermi? grazie
Scusate l’intromissione, ma se il codice qui sotto io lo inserisco in una root di un sito, quando vado a richiamare quel sito invece del suo indirizzo mi compare sottodominio.sito.it?
Perchè è questo che mi interessa. Cioè quando digito http://www.miosito.it invece devo visualizzare nel url http://www.miosito2.it
Con questo codice riesco a farlo?
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://sottodominio.sito.it/$1 [R]
Cio ho modificato il tuo suggerimento così per adattarlo alle mie esigenze ma non funziona:
RewriteCond %{QUERY_STRING} ^lang\=([^&]+)\&art\=([^&]+)$
RewriteRule ^$ /articles/%1/%2.php [R=301,L]
hai qualche suggerimento???
Grazie!!!