Riscrivere gli URL delle pagine web con il modulo mod_rewrite di Apache!

Giovanni Canella

19/11/2013

3876

Quando scriviamo applicazioni web con PHP, utilizziamo spesso le querystring per ottenere parametri direttamente dall'url della pagina, per esempio se vogliamo mostrare una specifica sezione, in modo dinamico, abbiamo una situzione simile alla seguente: http://ginho.it/sezioni.php?id=4. Abbastanza normale quando abbiamo poche variabili, ma quando ne abbiamo molte di più, per vari motivi, dobbiamo ricorrere alla mod_rewrite di Apache. Vediamo insieme che cos'è!

Non altro che un modulo integrato nel server Apache, che ci permette di scrivere nel modo da noi specificato gli url che vogliamo. Andrebbe utilizzato, a mio parere, per le seguenti 3 ragioni:

  • Leggibilità: Aspetto fondamentale, in quanto l'utente si troverà più a suo agio o si potrà orientare meglio, nel vedere un url del tipo: http://ginho.it/sezioni/PHP, invece che http://ginho.it/sezioni.php?id=14&nome=php.
  • Semplicità: Per permettere all'utente di ricordarsi meglio la pagina,
  • Sicurezza: Se vogliamo proprio chiamarlo così, dato che riscrivendo l'url, le querystring non saranno visibili direttamente a un eventuale malitenzionato, che vuole provare a iniettare qualche SQL Injection, ma deve ottenerle tramite una procedura più elelaborata. Mettendo così un paletto, seppur banale, ma almeno utile per bloccare sul nascere certi attacchi. Questo non implica che non dobbiamo scrivere applicazioni sicure: anzi! Per stare in tema ecco una guida a PDO, per eseguire query a un database in modo sicuro. 

Mod_Rewrite di Apache

Voglio inoltre sfatare un mito, che leggo spesso in giro, riguardo l'indicizzazione, che riscrivendo gli URL le nostre pagine verranno lette meglio dai motori di ricerca. Questo era vero molti anni fa, ma dopo i numerosi affinamenti agli algoritmi che stanno dietro a tutto, questa procedura non svolge alcun ruolo nelle SERP, quindi se volete riscrivere gli URL pensando di essere posizionati meglio, potete anche interrompere qui la lettura.

 

Introduzione

Chiusa questa parentesi, vi voglio prima spiegare come funziona questo particolare modulo, così da poterne capire appieno il suo funzionamento. Come avete visto prima quindi, viene utilizzato per "mascherare" indirizzi URL dinamici in statici, attraverso varie regole che andremo a definire, ma in linea di principio la pagina non dovrebbe aprirsi in quanto fisicamente non esiste. Ecco le varie fasi che avvengono quando apriamo una pagina:

  1. Invio richiesta al server, tramite il browser, per la sezione riguardo PHP per esempio: http://ginho.it/sezioni/PHP,
  2. Il server la riceve e la elabora, controllando che la pagina inserita esiste o meno,
  3. Prima di restituire un errore 404, andrà a cercare se abbiamo definito eventuali regole dentro il file .htaccess (qui una guida per abilitarlo nel caso possiate direttamente gestire il server), e in caso affermativo le traduce per poi inviarla al client e mostrarci la risorsa desiderata.

Il concetto è simile a quello del redirect, ma invece di reindirizzare, Apache lo traduce nel suo corrispondente. 

Mentre cosa succede quando uno spider di qualunque motore di ricerca ricerca arriva sull'URL riscritto? Bene o male la stessa cosa ma con qualche differenza:

  1. Viene inviata come sempre la richiesta al server,
  2. Viene controllato il file .htaccess, per la presenza di eventuali regole e viene inviato, in caso positivo, il codice HTTP 301 (Redirect permanente), sul nuovo URL, così da informare lo spider la nuova posizione della risorsa.
  3. Quindi viene rieffettuata la richiesta sul nuovo URL e viene ripetuta la procedura descritta prima.?

 

Installazione / Abilitazione

Non sempre tutti i server hanno la mod_rewrite abilitata: nel caso possiate gestirlo voi autonomamente allora potete seguire questa guida, altrimenti l'unica alternativa è contattare il gestore del vostro piano hosting, e sperare possa processare la vostra richiesta. Anche se in linea di massima, non dovrebbe essere un problema, in quanto ormai tutti i servizi in rete (anche quelli di fascia "bassa"), offrono l'utilizzo dell'.htaccess, così da poter proseguire la guida senza problemi.

 

Sintassi

Innanzitutto all'inizio del file, dobbiamo attivare l'engine:

RewriteEngine On

e solo successivamente potremo inserire le regole, formate da un'espressione regolare (anche chiamata regex). Ma cos'è precisamente? In pratica è una sequenza ordinata di simboli, che definiscono un pattern, atto all'identificazione di qualunque tipo di stringa. Questo è un potente strumento, che può essere utilizzato ovunque, ma noi in questo caso lo andremo a impiegare per riscrivere gli url.

Quindi dobbiamo partire sempre con RewriteRule seguito dal file mascherato e infine il nome del file originale.

RewriteRule ^sezioni/([0-9]+)$ sezioni.php?id=$1 [L]

Come possiamo notare ci sono due principali delineatori:

  • ^: Che identifica l'inizio del pattern,
  • $: Fine del pattern.

dove all'interno è presente:

([0-9]+)

Per identificare uno o più numeri da 0 a 9 dopo lo / di sezioni, da notare l'utilizzo del +, dopo la chiusura delle parentesi quadre, che permette l'inserimento di più di una sola cifra. Successivamente viene specificato l'URL originale, dove al posto dell'effettivo id della sezione (in questo caso), li passiamo una "variabile" $1, che verrà rimpiazzata nella struttura definita prima. Dobbiamo fare attenzione a quello che si inserisce nell'espressione regolare, in quanto se specifichiamo un tipo di dato sbagliato, bloccheremo il meccanismo.

Infine da notare il flag [L], che permette di interrompere il parsing se la riscrittura è avvenuta con successo.

Esempio pagina con URL riscritto (http://ginho.it/sezione/php)

Apache ce ne mette a disposizione diversi, e in una sola regola ne possiamo applicare al massimo 3. Ecco una lista esaustiva:  

  • [B]: Permette di effettuare l'escape su caratteri non alfa-numerici, come gli spazi, infatti se passiamo, un parametro simile al seguente: "windows & gnu/linux"  in un form per la ricerca nel sito, la pagina richiesta sarebbe chiamata in modo non previsto: cerca.php?query=windows%20&gnu%2Flinux. Con il flag B, invece vengono codificati anche la "e commerciale" e lo slash: cerca.php?query=windows%20%26gnu%2Flinux
  • [CO]: Imposta un cookie se la particolare richiesta è stata verificata. La sintassi corretta è. [CO=$NOME:$VALORE:$DOMINIO:$DURATA:$PERCORSO:$HTTPS]
  • [L]: Come visto prima, evita di proseguire oltre il parsing delle richieste, se quella attuale è stata verificata.

  • [F]: Fa restituire il codice HTTP 403 (Forbidden), su una specifica risorsa.
    es. RewriteRule .exe - [F] Blocca il download di tutti i file con estensione .exe. Viene utilizzato il trattino per indicare di non modificare l'URL, dato che non avrebbe senso riscriverlo se stiamo proibendo la risorsa! N.B = Con questo flag, viene chiamato automaticamente anche [L].

  • [G]: Restituisce un errore 410 (Gone), per indicare che tale risorsa non è più presente sul server. Anche in questo caso è implicito il flag [L].

  • [NC]: Indica di anilizzare la richiesta in modo che non tenga conto della minuscole/maiuscole (case in-sensitive). Utile quando si hanno, per esempio, immagini con estensione .jpg e .JPG.

  • [R]: Reindirizza nella pagina specificata. es. RewriteRule ^sezioni/?$ sezioni.php [R,NC,L]

  • [NE]: Di default, i caratteri & e ?, vengono codificati nel loro equivalente esadecimale, e tramite il seguente flag, non vengono toccati. Particolarmente utile quando abbiamo un URL riscritto come articolo/88/introduzione, che punta a un'ancora HTML, in questo modo: es. RewriteRule ^/articoli/88/#$1 [NE,R]  Altrimenti senza [NE], ci verrebbe restituito un errore 404.

?Per una lista completa, vi rimando nella documentazione ufficiale di Apache.

Ora se riprovate a leggere l'esempio precedente, inizierete a capirci qualcosa in più, ma se volete per esempio inserire un carattere alfa-numerico? Dobbiamo semplicemente modificare l'espressione regolare in:

RewriteRule ^sezione/([a-zA-Z0-9-/]+)?$ sezioni.php?nome=$1 [L]

Così selezioneremo:

  • Caratteri dalla a-z (minuscoli),
  • Caratteri dalla A-Z (maiuscoli),
  • Numeri da 0-9,
  • Lo slash (/),

I più letti

Ti potrebbero interessare