Nell’articolo precedente abbiamo visto cos’è l’.htaccess e il suo funzionamento di base.
Adesso ci occuperemo di scendere nei dettagli e di mostrare le direttive più complesse, per gestire ogni situazione possibile.
Al termine dell’articolo sarete in grado di agire tanto sui link con valori statici quanto su quelli con valori dinamici, e di personalizzare eventuali pagine di errore.
L’uso delle regole: ignorare alcune cartelle e gestire i link con i get
Entriamo nel cuore dell’.htaccess. Sotto al codice che abbiamo visto prima, possiamo stabilire delle regole precise. Innanzitutto, dobbiamo specificare quali delle cartelle non saranno coinvolte dalle direttive: questo ci sarà utile, per esempio, per le cartelle contenenti le immagini o i javascript.
1 2 3 4 |
#Cartelle da ignorare RewriteCond %{REQUEST_URI} img/ [OR] RewriteCond %{REQUEST_URI} js/ RewriteRule ^(.*) $1 [L] |
Il RewriteCond corrisponde alla condizione if
dei linguaggi di programmazione: se quello che c’è scritto si verifica, allora si applicherà la regola del RewriteRule
.
In pratica abbiamo stabilito che gli indirizzi che fanno riferimento alle cartelle “img” e “js” rimarranno come sono e non saranno modificati. L’attributo [L]
specifica che, nel caso sia trovato uno dei due indirizzi, la parte sotto che andremo a comporre con altre direttive non sarà letta.
Adesso vediamo come trasformare un link pieno di valori get nella forma voluta:
1 2 |
#Esempio di trasformazione di un link con valori statici RewriteRule ^prodotti/ categoria.php?prod=divano&cat=promozioni [L] |
In questo caso la direttiva è semplice: quando l’indirizzo base sarà esattamente nella forma “www.sito.it/categoria.php?prod=divano&cat=promozioni” gli utenti lo vedranno nel loro browser nella forma “www.sito.it/prodotti/”.
Si tratta, in parole povere, di un sostituto. I due get originali (“prod” e “cat”) sono ancora esistenti, ma per gli utenti non saranno visibili. Se per qualche motivo doveste fare dei controlli sul valore di “prod”, vi basta fare come al solito:
1 2 3 |
if($_GET['prod']=="divano"){ //azioni varie } |
Una nota importante: la priorità. L’.htaccess legge le direttive in ordine così come gli sono presentate. Questo significa che la prima direttiva trovata ha la priorità. Per esempio:
1 2 3 |
#Ordine di lettura delle direttive RewriteRule ^prodotti/ categoria.php?prod=divano&cat=promozioni [L] RewriteRule ^categorie/ categoria.php?prod=divano&cat=promozioni&pag=1 [L] |
Se noi gli andiamo a passare questo link
http://www.sito.it/categoria.php?prod=divano&cat=promozioni&pag=1
l’utente vedrà scritto sul suo browser “http://www.sito.it/prodotti/” e non “http://www.sito.it/categorie/” come ci si potrebbe aspettare. Perché? La seconda direttiva non è altro che la prima con l’aggiunta di un altro valore get (“pag”): l’.htaccess vede che, effettivamente, la prima regola coinvolge il nostro link, indipendentemente dai valori che ci sono dopo, e quindi esegue la direttiva; il fatto che ci sia il parametro [L] significa che, a quel punto, smette di leggere le direttive successive: per cui non vedrà mai la seconda direttiva.
Se il parametro [L] non ci fosse stato, però, l’.htaccess avrebbe invece proseguito e avrebbe incontrato la seconda direttiva, che sarebbe andata a sovrascrivere la prima.
Gestire i link con valori dinamici e l’uso delle espressioni regolari
Facciamo un passo avanti. Vediamo il caso in cui i valori nei link siano creati dinamicamente attraverso delle variabili php. Per esempio:
1 2 3 |
$prod="divano"; $tipo="promozioni"; $link="http://www.sito.it/categoria.php?prod=$prod&cat=$tipo"; |
Noi abbiamo stabilito manualmente il valore delle variabili $prod e $tipo, ma cosa succederebbe se non fossero stabilite a priori, a esempio perché estratte dal database? Come è possibile far leggere all’.htaccess dei valori dinamici?
Per agire correttamente, dovremmo far uso delle espressioni regolari. E’ la parte del tutorial più complessa da capire e che può portare il maggior numero di errori, ma ci permette di gestire qualsiasi tipo di stringa.
1 2 |
#Regola per gestire link con valori dinamici RewriteRule ^([a-z0-9\-]{3,50})/(.*)/ categoria.php?prod=$1&cat=$2 [L] |
L’.htaccess leggerà le variabili $1 e $2 e le trasformerà nella forma stabilita a inizio regola, nello stesso ordine con cui sono state lette.
Nel nostro esempio, l’utente vedrà il link nella forma:
http://www.sito.it/divano/promozioni/
Diamo un’occhiata alle espressioni regolari che abbiamo usato per “convertire” le variabili $1 e $2 nella forma voluta:
([a-z0-9\-]{3,50}) indica che la variabile passata è valida nel caso in cui sia composta da valori alfanumerici e abbia una lunghezza compresa tra 3 e 50
(.*) indica che qualsiasi valore passato sarà valido, quindi non verrà fatto nessun controllo sulla stringa della variabile $2
Nel caso in cui anche una sola delle due espressioni regolari non sia verificata, la regola non è valida e il link non viene convertito.
Potete capire come anche i link più complessi, con una certa esperienza, possano assumere la forma voluta. L’importante è conoscere a fondo le espressione regolari.
Personalizzare le pagine di errore
1 2 3 |
#Personalizzazione della pagina di errore ErrorDocument 404 /errore.php ErrorDocument 403 "Impossibile accedere" |
La regola specifica che in caso di errore 404 (pagina non trovata) verrà caricata la pagina errore.php
, mente in caso di errore 403 l’utente si vedrà apparire sullo schermo la scritta “Impossibile accedere”.