Internet con un nuovo punto di vista.
.htaccess e mod_rewrite per creare pagine facili da trovare (parte 2)
Questo 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.
Con 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
Nel 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.
Le 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
| Stampa l'articolo | Questo articolo è stato pubblicato da Giovdi il 11 novembre 2009 alle 14:19, ed è archiviato come Guide pratiche, Internet: Realizzare siti web, Programmazione: Web server. Puoi seguire i commenti a questo post attraverso RSS 2.0. Puoi pubblicare un commento o segnalare un trackback dal tuo sito. |






