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.