Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Riscrivere gli URL con il modulo mod_rewrite di Apache

Utilizzare il modulo mod_rewrite di Apache per riscrivere gli URL e renderli più gradevoli e facilmente posizionabili sui motori.
Utilizzare il modulo mod_rewrite di Apache per riscrivere gli URL e renderli più gradevoli e facilmente posizionabili sui motori.
Link copiato negli appunti

Quasi tutti conoscono mod_rewrite di Apache come il modulo in grado di creare indirizzi statici pienamente graditi ai motori di ricerca e agli standard web.

In realtà il mod_rewrite è uno strumento molto sofisticato e malleabile che può assolvere varie funzioni: potete usarlo al posto delle direttive Alias o delle direttive Redirect, potete fare sniffing a basso livello del browser per fornire contenuti adeguati, potete fare sniffing della lingua dell'utente per fornire contenuti nella sua lingua, potete creare un controllo sull'IP dell'utente in modo da smistare accessi leciti e accessi illeciti, potete far passare le espressioni regolari trovate ad uno script per essere poi processate, potete usare complessi schemi di controllo del flusso. In pratica il mod_rewrite svolge la funzione di altri 5-6 moduli specifici. Per questo motivo saperlo usare veramente a fondo è molto difficile.

Quello spiegato in questo articolo è il suo funzionamento base: ottimo per trasformare scomodi URL dinamici in accattivanti URL statici con cui fare felici i motori di ricerca ed appagare il nostro gusto estetico (un URL statico è più bello da vedere di uno dinamico pieno di strani caratteri).

Come attivarlo

Il modulo mod_rewrite è attivo praticamente su ogni sistema Apache a meno che in fase di compilazione non siano stati indicati solo alcuni moduli per alleggerire l'eseguibile (soprattutto nel caso di un linking statico) oppure che nel file di configurazione non sia stato omessa la direttiva per richiamare il modulo (più probabile).

Se avete accesso al server potete cercare di risolvere il problema: trovate la porzione del file di configurazione in cui vengono richiamati i moduli ed aggiungere la chiamata al mod_rewrite. Saranno presenti altre direttive del tipo

LoadModule nomemodulo.so (se in ambiente linux)
LoadModule nomemodulo.dll (se in ambiente windows)

Se è presente una direttiva con un modulo dal nome simile a mod_rewrite ma è preceduta dal simbolo cancelletto togliete quest'ultimo per attivarlo. Create un vostro file htaccess inserendovi la seguente direttiva per attivare il mod_rewrite.

RewriteEngine On

Funzionamento

Il funzionamento di questo modulo per l'utilizzo che ne andremo a fare noi è abbastanza semplice e consta di alcune direttive RewriteRule una in seguito all'altra con la seguente struttura:

RewriteRule EXPR Nuovofile [FLAG,FLAG]

Questo modulo legge le direttive in sequenza e prova tutte le espressioni regolari alla ricerca di quelle che possano andare bene. Ad ogni espressione regolare corrispondente viene applicata la trasformazione specificata. È comunque possibile fare in modo che il mod_rewrite cambi il suo funzionamento tramite vari flag spiegati in seguito.

Espressioni regolari

Le espressioni regolari valide per il mod_rewrite sono quelle standard valide per molti altri linguaggi di programmazione. Se avete già esperienza con l'uso delle espressioni regolari in un linguaggio come ad esempio PHP, MySQL e simili non troverete problemi a scrivere correttamente le direttive necessarie. Diversamente ecco un breve elenco di nozioni da conoscere.

Ci sono alcuni caratteri jolly con un significato speciale:

  • ^ indica l'inizio dell'URL
  • $ indica la fine dell'URL
  • . indica un qualsiasi carattere
  • | indica una scelta tra il carattere (o gruppo di caratteri) presente a sinistra e quello a destra (esempio a|f indica il carattere "a" o il carattere "f")

È possibile indicare il numero di caratteri consecutivi da considerare in diversi modi:

  • a+ corrisponde ad uno o più caratteri "a"
  • b* corrisponde a zero o più caratteri "b"
  • c? corrisponde a zero o un carattere "c"
  • d{3} corrisponde a tre caratteri "d"
  • e{5,} corrisponde a cinque o più caratteri "e"
  • f{2,6} corrisponde a 2 o più caratteri "f" fino a sei

Conviene sempre aver bene presente la differenza tra i primi tre per evitare di commettere errori concettuali. Un errore molto frequente consiste nell'indicare il tipo di carattere cercato senza specificarne il numero: se con una stringa del tipo "aaaab" diciamo al mod_rewrite di cercare ^ab non avremo un riscontro positivo; questo perché in realtà i caratteri "a" presenti sono più di uno. L'espressione regolare corretta da usare in questo caso è ^a+b.

È possibile indicare classi di caratteri cercati inserendoli all'interno di parentesi quadre:

  • [abc] indica la presenza di un carattere a scelta tra "a", "b" e "c"
  • [^abc] indica la presenza di un qualsiasi carattere tranne "a", "b" o "c" (tra parentesi quadre il carattere di accento circonflesso "^" non assume più il significato di inizio dell'URL ma di negazione dell'intera classe)
  • [a-d] indica la presenza di un carattere da "a" fino a "d", quindi "a" o "b" o "c" o "d". Questa notazione ci tornerà comoda per indicare un qualsiasi numero.

Ovviamente è possibile combinare le classi con gli indicatori di quantità come ad esempio [0-9]+ per indicare uno o più cifre.

L'ultima cosa da tenere a mente è il concetto di sostituti: potete evidenziare una parte dell'espressione regolare da estrapolare dalla stringa e da riutilizzare con l'URL reale. In pratica il mod_rewrite sta tutto in questa funzionalità, trasferisce parti di testo da un indirizzo fittizio ad uno reale. Questa funzionalità si ottiene indicando tra parentesi tonde una parte dell'espressione regolare che verrà successivamente ripresa nella composizione dell'URL reale. Esempio: ^/news/([0-9]+)/$

Per il resto ogni carattere corrisponde a sé stesso, quando volete specificarne uno riservato (quelli speciali elencati sopra) dovete semplicemente farlo precedere da un backslash "". Così . indica un punto e + indica un più. Dato che anche il backslash è un carattere speciale ne consegue che per indicarne uno dovrete usarne due (), questo non vi capiterà molto spesso comunque visto il campo in cui andiamo ad operare con le espressioni regolari (URL).

Riepilogando, i caratteri speciali sono: "$", "^", "|", ".", "-", "+", "*", "?", "(", ")", "[", "]", "{", "}", "".

L'URL reale

L'URL reale, il secondo parametro della direttiva RewriteRule, può essere relativo alla directory in cui ci stiamo trovando (in questo caso si tratta però di un path e non di un URL) o assoluto rispetto alla root del server (sempre un path) oppure assoluto rispetto al nostro dominio. Cioè può corrispondere ad uno di queste forme:

  • pagina.php?id=
  • /path/to/web/dir/pagina.php?id=
  • http://dominio/pagina.php?id=

Il mio consiglio è di utilizzare sempre la prima forma, è portabile in caso di cambiamenti di dominio o di spostamento di tutta la struttura directory precedente la document root.

Oltre ad indicare il nome dello script da richiamare possiamo inserire parti dell'espressione regolare intercettate precedentemente (quelli che ho chiamato sostituti). Per farlo dovete indicare un segno di dollaro "$" seguito da una cifra numerica ad indicare la posizione di questa corrispondenza.

Attenzione: la cifra non corrisponde alla posizione effettiva dei sostituti trovati ma a quella dei sostituti presenti nell'espressione regolare.

Ad esempio in questa espressione regolare /news/p/([0-9]+)?/([0-9]+)/ non è detto che il primo sostituto venga trovato (infatti è seguito dal punto interrogativo che come abbiamo visto indica o meno la corrispondenza del carattere): nonostante questo per indicare l'eventuale numero che segue /p/ è necessario chiamarlo con $1 e chiamare con $2 l'ultimo numero. Con gli esempio che forniremo più avanti questo problema apparirà più chiaro.

Infine è possibile inserire all'interno di un URL una variabile impostata da apache precedentemente per mezzo della seguente forma: "%{variabile}". Le variabili impostate da Apache le potete trovare tramite PHP con la funzione phpinfo() alla sezione variabili del server ($_SERVER).

Flag

Come terzo parametro della direttiva possiamo aggiungere dei Flag che modificano il funzionamento del mod_rewrite. Vanno indicate tra parentesi quadre intercalate da virgole. Ecco le principali:

L - ultima direttiva: generalmente il mod_rewrite esegue pazientemente tutte le espressioni regolari presenti una dopo l'altra continuando a sostituire gli URL corrispondenti alle espressioni con gli URL reali forniti. Se però un URL non dovrà subire altre trasformazioni è necessario impostare questo flag per impedire ad apache di consumare inutilmente risorse del sistema.

QSA - query string append: aggiunge all'URL reale la query string presente al livello della finta URL. Molto utile per portarsi dietro contenuti appesi in query string o anche variabili di cui non avevamo tenuto conto.

NC - no case: valuta l'espressione regolare senza tenere conto di maiuscole o minuscole.

C - chain: lega la presente direttiva alla successiva facendole terminare correttamente entrambe o non applicandone nessuna.

Casi comuni

URL da trasformare: http://dominio/52/Descrizione.htm
URL reale: /show.php?id=1

RewriteRule ^/([0-9]+) /show.php?id=$1 [L,QSA,NC]

La parte importante dell'URL in questione è rappresentata dal numero, solo questo infatti ci servirà da passare al nostro script show.php. Per rendere più gradevole l'URL abbiamo aggiunto al numero anche una stringa di descrizione. Io solitamente separo il valore numerico e la descrizione per mezzo di uno slash in modo che sembri una pagina all'interno di una directory ma è possibile usare anche l'underscore "_" o il trattino "-" o la virgola "," o il carattere che preferite puramente in base al vostro gusto estetico.

URL da trasformare: http://dominio/docs/52-Nome-del-documento.pdf
URL reale: /docs/52.pdf

RewriteRule ^/docs/([0-9]+)(.[a-z]{3,4}) /docs/$1$2 [L,QSA,NC]

Questa regola è molto utile nel caso di documenti collegati a qualche entità presente su un nostro database (ad esempio un allegato ad una news). In questo modo potremo salvare il documento fisicamente sul filesystem con nome id della news e sua estensione ma collegarlo con un nome più eloquente.

URL da trasformare: http://dominio/script.py?id=12
URL reale: /script.php?id=12

RewriteRule ^/(.+).py(.+)? /$1.php$2 [L,QSA,NC]

Questa regola ci permette di mascherare l'uso di PHP facendolo sembrare un altro linguaggio di programmazione lato server, Python in questo esempio.

Ti consigliamo anche