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
Popularity: 44% [?]
[...] 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