back to top

URL Rewriting: riscrivere le URL con il mod_rewrite di Apache

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

Pubblicitร 

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.

Pubblicitร 
Claudio Garau
Claudio Garau
Web developer, programmatore, Database Administrator, Linux Admin, docente e copywriter specializzato in contenuti sulle tecnologie orientate a Web, mobile, Cybersecurity e Digital Marketing per sviluppatori, PA e imprese.