URL rewriting con mod_rewrite
Spesso e volentieri, sul web, si incontrano degli indirizzi URL “brutti”:
http://weblog.seanbone.ch/read.php?id=42
Questi indirizzi non hanno nessun significato per un utente, sono pieni di numeri, punti di domanda ed altri strani segni – difficili da memorizzare o da ripetere ad un amico. E non bisogna nemmeno dimenticare il Search Engine, per cui l’URL è molto importante: un indirizzo del genere non fornisce alcuna parola chiave di rilevanza per questa pagina specifica del sito.
Come soluzione a questi problemi esiste la tecnica dell’URL rewriting – ossia l’utilizzo del modulo di Apache mod_rewrite
(o simile) per rendere gli URL di un sito più “appetibili”.
Abbiamo già visto come si possono usare i file .htaccess
per reindirizzare il client. L’URL rewriting è fondamentalmente un’estensione della stessa tecnica.
Supponiamo di avere il file read.php
, che prende l’argomento $_GET['id']
, che rappresenta l’ID del messaggio da leggere. Avremmo quindi indirizzi del genere: http://weblog.seanbone.ch/read.php?id=42
. Vorremmo riscriverli in modo da avere qualcosa del tipo: http://weblog.seanbone.ch/URL-rewriting
.
Innanzitutto creiamo un file .htaccess
per reindirizzarci da http://weblog.seanbone.ch/URL-rewriting
a read.php?post=URL-rewriting
:
RewriteEngine On
RewriteRule ^([^./=?]+)$ read.php?post=$1 [P]
La regex ^([^./=?]+)$
individua la parte URL-rewriting
dell’indirizzo richiesto. Stiamo cercando una sequenza di uno o più caratteri che non contenga i caratteri . / = ?
(per evitare di sovrascrivere altre pagine).
Reindirizziamo poi a read.php?post=$1
, dove $1
sta per la parte di URL individuata dal pattern (qui URL-rewriting
).
Infine, la [P]
sta per “proxy”. In altre parole, il server non comunicherà al browser il reindirizzamento, bensì andrà a prendere read.php
e ritornerà il risultato come se fosse /URL-rewriting
. In questo modo, la pagina http://weblog.seanbone.ch/read.php?post=URL-rewriting
carica nel browser, ma l’URL visibile all’utente sarà ancora http://weblog.seanbone.ch/URL-rewriting
.
Abbiamo finito il file .htaccess
, ma manca ancora un’ultima tappa.
Se prima il file read.php
riceveva direttamente l’ID dell’articolo da visualizzare, ora riceve invece una versione “codificata” del titolo: bisognerà risalire all’ID corrispondente prima di poter proseguire.
Dobbiamo quindi considerare il processo di codifica del titolo della pagina. Questo è necessario per rimuovere dal titolo eventuali caratteri che non possono esistere in un URL – ad esempio gli spazi.
Abbiamo fondamentalmente due possibilità. La prima è quella di codificare il titolo ogni volta che vogliamo fare un link ad una pagina (attraverso una funzione prestabilita di codifica) e poi usare la funzione di decodifica (l’inversa della codifica) per risalire al titolo originale e con questo all’ID.
In alternativa, possiamo codificare il titolo una volta sola, quando viene creato, e memorizzarlo. In questo modo per risalire all’ID associato ad un URL non è necessario decodificarlo – basta confrontarlo direttamente con quelli memorizzati. Questo metodo ha il vantaggio aggiuntivo di poter modificare leggermente l’URL: ogni tanto un titolo completo può renderlo scomodamente lungo, ad esempio.
Per riassumere il funzionamento di un URL rewrite: il browser fa una richiesta per http://weblog.seanbone.ch/URL-rewriting
, il modulo mod_rewrite
‘intercetta’ la richiesta ed identifica la componente URL-rewriting
. Poi esegue read.php?post=URL-rewriting
e ritorna il risultato al browser, senza però informarlo del piccolo ‘scambio’ avvenuto. In questo modo l’utente vede http://weblog.seanbone.ch/URL-rewriting
come URL, ma in realtà accede alla pagina http://weblog.seanbone.ch/read.php?post=URL-rewriting
.