Il mod_rewrite di Apache è uno dei moduli più utilizzati tra quelli disponibili per questo Web server, in particolare per il fatto di mettere a disposizione dei Webmasters uno strumento che permetta da una parte di creare siti basati su applicazioni web based dinamiche e dall’altra di rendere le pagine prodotte dall’applicazione più "digeribili" per i motori di ricerca attraverso la cosiddetta tecnica dell’URL Rewriting.
A cosa serve mod_rewrite
Ma qual’è la funzione di questo modulo? In pratica il mod_rewrite consente di "tradurre" un’URL in un’altra definita dall’utilizzatore seguendo determinate regole che vanno scritte all’interno del file di configurazione di Apache oppure dentro ad un apposito file, denominato .htaccess, che andrà uploadato all’interno della root del nostro sito web (anche l’upload di questo file deve essere effettuato seguendo determinati criteri, ma approfondiremo questo discorso tra breve).
Un caso classico di utilizzo del mod_rewrite è quello relativo alla traduzione di URL statiche in dinamiche; badate bene che questo concetto è fondamentale, infatti il modulo non nasce per trasformare indirizzi dinamici (contenenti querystring) in statici, bensì per il contrario! Il motore di ricerca ed i nostri utenti vedranno una URL di tipo statico (pippo.html), ma in realtà la risorsa esiste sotto un indirizzo dinamico (pagina.php?id=pippo).
Per far questo scriveremo la nostra regola di traduzione all’interno del file .htaccess e uploaderemo quest’ultimo nel percorso desiderato (cioè quello per cui sono valide le regole di rewrite); da quel momento in poi per le pagine coinvolte avverranno i seguenti passaggi per il nostro Web Server:
- i clients richiederanno di accedere ad una determinata risorsa digitando un’URL nella barra degli indirizzi del browser (nel nostro caso pippo.html);
- il Web server (naturalmente Apache), riceverà l’input e controllerà se il percorso specificato è valido per la risorsa richiesta;
- la pagina pippo.html non esiste, quindi la richiesta in linea teorica non dovrebbe essere soddisfatta;
- ma ecco che il Web server cercherà istruzioni sul da farsi e le troverà all’interno del file .htaccess;
- comprese le regole indicate all’interno del file, il Web server tradurrà l’indirizzo digitato in quello reale e restituirà la risorsa desiderata.
Leggendo i passaggi previsti dalla procedura di "traduzione" delle URL, sarebbe possibile confondere questo modulo con altri a disposizione in Apache come per esempio quello per il redirect, col rewrite però non stiamo redirezionando il percorso di una richiesta ad una risorsa ma "mascherando" il percorso stesso; quindi l’URL utilizzata dal client in realtà non sarebbe un percorso valido all’interno del server e potrebbe anche non esserlo mai stato, cosa che invece accade nel caso dei redirects.
Ma perchè mascherare un’URL? Oggi come oggi i motivi vanno ricercati in fattori che spesso non attengono ad argomenti strettamente tecnici o relativi allo sviluppo delle applicazioni.
Inizialmente il mod_rewrite era nato per ovviare al problema delle URL troppo lunghe da digitare, capitava infatti (e spesso capita ancora) che per raggiungere una detrminata risorsa si dovessero digitare querystring strapiene di variabili e di relativi parametri; il rewrite consente di eliminare questo problema grazie alla possibilità di mettere a disposizione dei clients URL più user friendly.
Oggi il rewrite è diventato invece un argomento molto importante per operazioni riguardanti il posizionamento delle pagine Web nei motori di ricerca. E’ noto infatti che questi ultimi non indicizzano in modo efficiente le pagine raggiungibili con querystring troppo lunghe o troppo ricche di parametri, questo fattore può limitare la capacità di posizionamento di una risorsa all’interno delle SERP. In pratica possiamo affermare che ciò che è user friendly per gli utenti lo è anche per i motori di ricerca (anche dette URL SEO-Friendly).
Abilitare il mod_rewrite
Le funzionalità di rewriting del Web server Apache dipendono dalla disponibilità o meno del relativo modulo. Quest’ultimo dipende dall’esistenza all’interno del sistema (Windows o Linux non importa purchè il Web server sia Apache), di un file denominato mod_rewrite.so che presiede al modulo mod_rewrite.c.
Se disponiamo di questo modulo il prossimo passo da compiere sarà quello di controllare se esso è stato abilitato nel file di configurazione di Apache, denominato httpd.conf – Una volta aperto il file dovremo ricercare la sezione dedicata alla lista dei moduli; ne troveremo tanti, ognuno dedicato a svolgere una determinata funzione e alcuni saranno caratterizzati dal simbolo del cancelletto ("#") posto all’inizio della riga.
Ogni riga corrisponde all’istruzione di caricamento di un modulo e il simbolo "#" indica che una riga è stata "commentata" quindi il relativo modulo non è abilitato. Per abilitare il rewrite sarà necessario eliminare il simbolo del cancelletto posto davanti alla riga:
LoadModule rewrite_module modules/mod_rewrite.so
che permette il caricamento del modulo; stesso discorso per quanto riguarda la riga:
AddModule mod_rewrite.c
Un’avvertenza: l’elenco dei moduli come viene presentato all’interno del file di configurazione di Apache non è casuale, quindi non effettuate correzioni alla disposizione della lista se non sapete molto bene cosa state facendo. In secondo luogo, ricordiamo che è buona norma creare una copia di sicurezza (backup) del file prima di effettuare qualsiasi modifica.
Ora ci sono ancora alcuni passaggi da affrontare prima di salvare "httpd.conf"; nel file troverete delle istruzioni relative ai servizi che hanno il permesso di accedere al Web server:
<Directory />
Options FollowSymLinks Indexes
AllowOverride All
</Directory>
Ciò che ci interssa in particolare è la direttiva "AllowOverride", questa la ritroveremo più in basso all’interno del file e dovrà essere settata su All, grazie ad essa infatti permetteremo al Web server di utilizzare i file .htaccess che salveremo nelle directory contenente i file per cui dovranno essere riscritte le URL.
Un caso particolare è quello relativo ai VirtualHost, se infatti all’interno del file di configurazione di Apache ne sono stati definiti alcuni, quelli per il quale si desidera abilitare il mod_rewrite richiedono alcune modifiche.
La struttura tipica per la definizione di un VirtualHost è la seguente:
<VirtualHost www.dominio.it>
ServerName www.dominio.it
DocumentRoot /path/website
</VirtualHost>
Ora, per poter abilitare il rewriting delle URL (o riscrittura delle URL) è necessario aggiungere una directory contenenente la direttiva di AllowOverride per il VirtualHost interessato, quindi avremo:
<VirtualHost www.dominio.it>
ServerName www.dominio.it
DocumentRoot /path/website
<Directory /path/website>
AllowOverride All
</Directory>
</VirtualHost>
Fatte le opportune modifiche alle istruzioni presenti nel file di configurazione di Apache, potremo salvare httpd.conf, riavviare il Web server e cominciare ad utilizzare il mod_rewrite.
Scrivere un file .htaccess
Un file .htaccess non è altro che un comune file di testo in cui vengono scritte delle istruzioni che il Web server è in grado di interpretare sulla base di regole predefinite. I file .htaccess possono essere utilizzati per le più svariate funzioni: redirect sulle risorse, aliasing e naturalmente anche per il mascheramento delle URL tramite rewrite.
Nel file di configurazione di Apache esiste una direttiva che indica quale tipologia di file deve essere utilizzata dal Web server per la ricerca di direttive all’interno delle directory nella Web root:
AccessFileName .htaccess
Come è noto, se si vuole tenere nascosta una risorsa da occhi indiscreti, posizionarla all’interno della Web root, che per definizione è "aperta al pubblico", non è propriamente una buona idea. Fortunatamente Apache prevede una regola di default che impedisce la visualizzazione dei file .htaccess:
<Files ~ "^.ht">
Order allow,deny
Deny from all
Satisfy All
</Files>
grazie ad essa non sarà possibile accedere anche ad altri file, come per esempio quelli per la definizione di aree riservate come per esempio gli .htpasswd.
Per creare un file .htaccess esiste l’unica regola di non associare ad esso alcuna estensione; sarà possibile utilizzare un qualsiasi editor di testo, ma è bene preferire quelli che non aggiungono al file alcun tag di formattazione.
Per Windows una buona soluzione è quella di sfruttare il sempre utile Blocco Note, basterà aprire il programma scrivere le nostre regole per poi andare su:
File > Salva con nome
quindi scrivere ".htaccess" nel campo "nome file", selezionare "tutti i file" e poi cliccare su "Salva" (come da figura):
Definire le regole di riscrittura delle URL
Le regole di rewriting nel file .htaccess vanno introdotte con la direttiva RewriteRule a cui seguono le istruzioni per il mascheramento. Facciamo un semplice esempio, supponiamo di voler riscrivere l’URL (reale) "http://www.sito.it/info.php?pag=foo" in "http://www.sito.it/info/foo.htm". Per farlo potremmo scrivere le seguenti istruzioni:
RewriteEngine On
RewriteRule ^info/([^/]+).html$ info.php?pag=$1 [L]
Scomponiamo il codice presentato:
- RewriteEngine On abilita l’utilizzo del mod_rewrite.
- RewriteRule introduce le regole di riscrittura.
- ^info/([^/]+).html$ e info.php?pag=$1 indicano rispettivamente l’URL fittizia e quella reale.
- [L] sta per "last" ed indica che, se vi è corrispondenza, non bisogna procedere con ulteriori verifiche.
basterà uploadare il file nella cartella contenente i file per cui devono essere applicate le regole per otenere il risultato voluto.
Alcuni esempi di Rewrite delle URL
Un esempio estremamente semplice di riscrittura delle URL potrebbe essere il seguente in cui il nome di un vecchio file non più esistente viene utilizzato come mascheramento per raggiungere un nuovo file nuovo:
RewriteEngine on
RewriteRule ^old.html$ new.html [L]
Come è possibile notare, all’interno delle regole utilizzate sono stati introdotti alcuni caratteri speciali:
- Il carattere speciale "^", simboleggia la parte iniziale di un’URL all’interno della directory corrente, cioè quella in cui deve essere uploadato il file .htaccess; "^" permette in pratica di sostituire qualsiasi inizio di stringa.
- Il simbolo del dollaro, "$", simboleggia la fine di una stringa delimitando la parte in cui si conclude la riscrittura.
- il backslash, "", viene utilizzato invece come carattere di escape, è stato posto davanti al punto fermo per indicare al Web server che questo dovrà essere interpretato come un qualsiasi altro carattere (in mancanza il punto verrebbe interpretato com carattere speciale che indica "un qualsiasi carattere").
Volendo esaminare esempi più raffinati, è possibile introdurre il discorso riguardante l’utilizzo delle espressioni regolari, queste infatti consistono in una serie di caratteri sostitutivi (ne abbiano visto alcuni in precedenza) che ci permettono di utilizzare una sola regola di riscrittura per più file (riscrivere manualmente tutte le URL di un portale composto da centinaia se non migliaia di pagine sarebbe infatti un’impresa abbastanza ardua!).
Facciamo l’esempio di voler mascherare un’URL tipo "prodotti.php?prodID=2" nella più semplice "prodotti/2/", le regole necessarie per il nostro .htaccess potranno essere scritte in questo modo:
RewriteRule ^prodotti/([0-9]+)/$ /prodotti.php?prodID=$1
Di seguito alcune osservazioni relative al nostro esempio:
- l’espressione ([0-9]+) sta ad indicare un valore variabile (delimitato da parentesi tonde ()) che può avere come contenuto un qualsiasi numero intero indicato dal gruppo [0-9] seguito dal simbolo + (che sta ad indicare la presenza di "uno o più caratteri"). Questa variabile verrà utilizzata per passare il valore di prodID alla URL reale.
- Il simbolo del dollaro presente alla fine della prima URL (quella fittizia) blocca il processo di riscrittura a quell’altezza e quindi non saranno trovate corrispondenze se la URL digitata proseguisse oltre quella slash.
- Il simbolo del dollaro accompagnato da un valore numerico (nel nostro caso $1) che abbiamo utilizzato nella parte destra della nostra espressione serve per richiamare il valore variabile (nel nostro caso un numero intero) individuato dalle parentesi tonde nell’espressione di sinistra.
Se la nostra URL richiedesse più di un solo parametro, ovviamente, si utilizzerebbero diverse parentesi tonde a sinistra e le si richiamerebbe a destra mediande il ricorso a diversi simboli di dollaro seguiti da numeri progressivi ($1, $2, $3, ecc.) corrispondenti alle parentesi di sinistra. Di seguito un esempio:
RewriteRule ^prodotti/([0-9]+)/([0-9]+)/$ /prodotti.php?catID=$1&prodID=$2
Naturalmente i valori passati come parametri alle variabili possono anche essere delle stringhe: in questo caso utilizzeremo le espressioni [a-z] (per i caratteri minuscoli), [A-Z] (per i caratteri maiuscoli) o [A-Za-z] (per qualsiasi carattere sia esso minuscolo o maiuscolo). Per fare un esempio si supponga di dover riscrivere una URL del tipo "http://www.sito.it/articoli.php?cat=sport&id=1" in "http://www.sito.it/articoli/sport/1.html;
RewriteRule ^/articoli/([a-z]+)/([0-9]+).html /articoli.php?cat=$1&id=$2 [L]
Quelle visti qui sopra, ovviamente, non sono che una minima parte delle potenzialità offerte dal modulo mod_rewrite, non mi resta quindi che invitarvi ad approfondire l’argomento in attesa di un nuovo articolo dedicato a questo fantastico modulo di Apache.