Link
closeQuesto articolo è stato pubblicato 8 mesi 20 giorni fa quindi alcuni contenuti o informazioni presenti in esso potrebbero non essere più validi.
Se riscontri errori o link rotti, puoi segnalarli inviando un commento.

2009-11-07 - 036. Immagine 1Con qualche giorno di ritardo sul previsto, riprendo a parlare del modulo mod_rewrite in Apache.

Una volta attivato il modulo con RewriteEngine ed impostata la cartella base con RewriteBase, è il momento di occuparci delle altre 2 tipologie di direttive: RewriteRule e RewriteCond, fondamentali per una buona riscrittura degli URL.

Le regole di RewriteRule

2009-11-07 - 036. Immagine 2Nel precedente articolo (il cui paragrafo sul RewriteBase è stato corretto in seguito ad un errore di interpretazione dalla documentazione) abbiamo impostato un esempio che useremo anche in questa parte. L’esempio riguardava la riscrittura di un URL del tipo www.example.com/home/pagine/index.php in maniera più abbreviata e semplice.

Tramite il RewriteBase, abbiamo impostato la cartella sulla quale applicare le condizioni e le regole, ovvero /. Con questo presupposto, possiamo rimuovere con delle regole home e pagine dall’URL.

Il RewriteRule funziona per mezzo di espressioni regolari ed ha questa sintassi:

RewriteRule ^sorgente$ destinazione [flags]

Volendo rimuovere home e pagine, dunque, possiamo arricchire il nostro .htaccess in questo modo:

RewriteEngine on
 RewriteBase /
 RewriteRule ^(home/pagine/){0,1}(.*)$ home/pagine/$2.php [L]

In base a questa regola, il nostro sorgente sarà una qualsiasi pagina, mentre la destinazione sarà home/pagine/ seguita dalla pagina richiamata. www.example.com/index.php verrà quindi riscritta come www.example.com/home/pagine/index.php risultando di fatto raggiungibile. $2 all’interno della destinazione rappresenta un collegamento alla prima espressione della sorgente e la restituisce così come viene soddisfatta.

Si è stati costretti a ridefinire, inoltre, l’URL di destinazione anche come sorgente impostando una specie di condizione: sia se home/pagine/ c’è, sia se non c’è, l’URL riscritto deve comunque averlo. Forzare questa dichiarazione è necessaria poiché il server Apache una volta riscritto l’URL per la prima volta e richiamata la pagina, ripete nuovamente l’htaccess dalla prima riga. E’ possibile provare a rimuovere questa ridefinizione solo se la riscrittura non cambia o imposta il nome della pagina, ma aggiorna una chiave passata come parametro.

Ma possiamo  semplificare ulteriormente la navigazione all’interno delle pagine rimuovendone l’estensione, a condizione però che siano tutte dello stesso tipo:

RewriteEngine on
RewriteBase /
RewriteRule ^(.*).php$ $1
RewriteRule ^(home/pagine/){0,1}(.*)$ home/pagine/$2.php [L]

Dato che usiamo un’estensione dedicata alle pagine web (php, ovvero scaricandole non è che si fa molto…) come si può vedere dall’esempio, la riga 2 rimuove l’estensione, mentre la 3 la riaggiunge. Questo giochino è necessario poiché omettendo la 2 ci ritroveremo chiamata una pagina index.php.php.

Infine manca la definizione della home page in modo che se non è indicata alcuna pagina venga richiamato l’index:

RewriteEngine on
RewriteBase /
RewriteRule ^(.*).php$ $1
RewriteRule ^$ index
RewriteRule ^(home/pagine/){0,1}(.*)$ home/pagine/$2.php [L]

Da notare che l’unico flag che abbiamo utilizzato è stato [L] e tra quelli disponibili è il più utilizzato. [L] permette di interrompe l’elaborazione dell’htaccess se la regola a cui è associato viene eseguita. Altri flags molto comuni sono: [QSA] che riporta nella destinazione l’elenco delle variabili passate nell’indirizzo, per esempio, come $_GET, [NC] per indicare che una regola è valida senza considerare le maiuscole e minuscole. Per una lista dei flags è possibile consultare ed [S=#] che indica il numero di regole da saltare se quella a cui è associata è valida. Quest’ultima è molto utile per creare degli pseudo if…then…else e la vedremo nella prossima sezione.

2009-11-11 - 037. Immagine 1Le condizioni di RewriteCond

Se vogliamo che alcune regole vengano applicate solo in determinate condizioni, dobbiamo aggiungere un’altra regola. Ci viene in aiuto il RewriteCond.

Il RewriteCond, funziona, come per le RewriteRule, per mezzo di espressioni regolari e definisce una regola indicata subito dopo oppure dopo un certo numero di regole specificato che deve essere presa in considerazione solo se la condizione è verificata. La direttiva è definita in questo modo:

RewriteCond condizione [flags]

Ad esempio, nonostante sia fortemente sconsigliato, nel nostro sito si potrebbe visualizzare una pagina d’ingresso dedicata a Chrome. Bisogna un attimino giocarci.

RewriteEngine on
RewriteBase /
RewriteRule ^(.*).php$ $1

# Se il browser è Chrome:
RewriteCond %{HTTP_USER_AGENT} ^.*Chrome.*
RewriteRule ^$ index-chr

# Torna infine al flusso principale del file:
RewriteRule ^$ index-alt
RewriteRule ^(home/pagine/){0,1}(.*)$ home/pagine/$2.php [L] 

I commenti dicono tutto.

Le condizioni che è possibile verificare sono innumerevoli: si passa dalle variabili di sistema, quali HTTP_USER_AGENT per il tipo di browser, REQUEST_URI per l’URL richiesto o puntatori a regole precedenti ($0, $1…) o condizioni (%0, %1…).

Oltre alle condizioni, comunque, anche qui ci sono i flags come [OR] per mettere in collegamento due RewriteCond e convalidare la regola successiva per l’una o l’altra espressione, [-f] per verificare se un file esiste o [-d]per una directory.

La documentazione ufficiale

La complessità di questo argomento, però, è talmente vasta che è difficile scrivere tutto in due righe. Per approfondire il discorso, è possibile collegarsi alla pagina dedicata al modulo mod_rewrite del sito Apache.org.

In caso di dubbi o suggerimento, in ogni caso, è possibile lasciare un commento qui :)

Condividi:
  • Print
  • PDF
  • email
  • Add to favorites
  • Facebook
  • Google Buzz
  • MySpace
  • Segnalo
  • Wikio IT
  • OKNOtizie
  • Digg
  • del.icio.us
  • Technorati
  • Google Bookmarks
  • Live
  • Yahoo! Bookmarks