Apache Mod_rewrite


Il mod_rewrite per apache è un modulo di apache che si occupa di riscrivere un’url sulla base di piccole regole impostate precedentemente, sicuramente avrete visto in giro siti che nell’url non hanno parametri ma sembrano tutte cartelle.
Il modulo in questione è già installato nel pacchetto base di apache dalla versione 2, basta solo abilitarlo all’interno del httpd.conf

Inserite queste righe nel file httpd.conf alla dichiarazione vhost:

RewriteEngine on
RewriteLog /path/del/logs/server.rewrite.txt
RewriteLogLevel 1

Il log del rewrite, se quest’ultimo è molto utilizzato, è molto pesante quindi non abusatene, in genere basta la prima riga.

La prima prova che si può fare con il rewrite è un semplice redirect senza tanti voli pindalici, ad esempio voglio che una pagina php mi diventi una cartella:

RewriteRule ^/biogarphy.php /biography/ [R=301]

in questo caso quando viene richiesta la pagine biography.php si viene redirezionati (nel modo più trasparente possibile) verso la cartella /biography/, senza dover creare o spostare files vari.
Se esiste un file /biography.php esso viene ignorato in quanto il rewrite viene prima di qualsiasi altra cosa.
Alla fine nel nostro browser (o quello dell’utente finale) rimarrà il file.php ma noi sappiamo che invece è andato a leggere la pagina iniziale della cartella biography.

Possiamo poi tramite questo codice:

RewriteRule ^/(.+)/?$ /content/$1 [L]

Fare in modo che tutte le chiamate alla root e le successive non facciano riferimento alla cartella / ma alla cartella /content. Quindi una chiamata a /disclaimer.php andrà a finire tradotta /content/disclaimer.php

Possiamo anche passare dei parametri, nomi di file e quant’altro con delle semplici e basilari regexp:

RewriteRule ^/articolo.php/(.*)$ /mioCMS/articolo.php?id=$1 [NE]
RewriteRule ^/articolo.php/(.*)/$ /mioCMS/articolo.php?id=$1 [NE]

Con questa regolina dico al modulo di tradurre tutte gli URL che iniziano con /articolo.php/qualsiasinumero nell’url dello script che visualizza l’ipotetico articolo, in questo modo abbrevio l’url e allo stesso tempo passo i parametri giusti al mio script senza bisogno del fastidioso punto di domanda.

Adesso possiamo dare spazio alla fantasia, cioè adesso possiamo veramente tradure qualcosa che non assomiglia per nulla al’url finale con qualcosa di leggibile.

RewriteRule ^/HardCoded/(.*)/(.*)/(.*)/(.*)/$ /index.php?$1=$2&$3=$4

oppure

RewriteRule ^/HardCoded/(.*)/(.*)/(.*)/(.*)/$ /index.php?id=$1&categ=$2&action=$3&lang=$4

A che serve? innanzi tutto dobbiamo pensare a che non tutti quelli che visitano il nostro sito sono delle brave persone e che spesso (molto più di quanto si pensi) deducono dall’url quante èiù informazioni possibile, ad esempio il tipo di cms utilizzato o che script abbiamo installato per il forum, o addirittura deducono in che modo abbiamo organizzato il sito se in categorie o meno e tante altre cosine, mod_rewrite ci da la possibilità di nascondere la maggior parte delle informazioni al’utente che viene a visitare.
Poi dopo aver dato un’occhiata alla sicurezza del nostro sito, possiamo anche pensare a farci belli davanti ai motori di ricerca che non si troveranno davanti ad un sito fatto da pagine dinamiche dove basta cambiare un parametrino e cambia il contenuto, bensì di troveranno davanti ad un sito fatto di mille cartelle tutte differenti.

Quest’articolo è un piccolo passaggio della guida, vi do qualche riferimento per capirne di più.
http://www.engelschall.com/pw/apache/rewriteguide/
http://httpd.apache.org/docs/mod/mod_rewrite.html
http://httpd.apache.org/docs/misc/rewriteguide.html

Apache Mod_rewrite ultima modifica: 2006-04-26T00:00:00+00:00 da Enrico

Related Posts

5 Comments.

  1. segnalo inoltre questo link:
    http://www.webmaster-toolkit.com/mod_rewrite-rewriterule-generator.shtml

    che permette di generare le regole partendo da una base e da cosa si vuole ottenere, per chi ne capisse poco di regexp � molto utile, io stesso l’ho utilizzato le prime volte.

    enjoy it!

  2. Dimenticavo di aggiungere che per abilitare il modulo si deve necessariamente fare in modo che apache lo carichi, con queste 2 voci:

    La prima voce è la seguente: [b]LoadModule rewrite_module modules/mod_rewrite.so[/b]

    La seconda è [b]AddModule mod_rewrite.c[/b]

    A volte queste due istruzioni sono entrambe “commentate” dal simbolo del cancelletto “#” e quindi non abilitate di default; in questo sarà sufficiente eliminare entrambi i “#” e salvare le modifiche apportate ad “httpd.conf” per poter utilizzare il mod_rewrite.

  3. Ho cercato di utilizzare lo strumento per la generazione automatica delle RewriteRule ma non funziona… almano a me :(
    Non restituisce nessun errore però:(

  4. guarda io ho appena provato a fare da
    http://www.etechs.it/forum.php?id=134
    a
    http://www.etechs.it/forum/id/134/

    e m’ha dato quanto segue:
    Options +FollowSymLinks
    RewriteEngine on
    RewriteRule forum/(.*)/(.*)/$ /forum.php?$1=$2

  5. 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:

    $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.