Mi scuso innanzitutto con effe8 per il ritardo nella pubblicazione di questa ultima parte della guida
Inoltre, devo aggiungere, che causa nuovo lavoro non ho molto tempo libero (specie ora che devo fare stage e università
) quindi questa quarta parte sarà leggermente "ridotta" rispetto alle intenzioni.
In particolar modo gli esempi sono davvero pochi (la parte delle "pagine amiche dei motori di ricerca è già stata fatta quindi un po' di esempi sono svaniti da questa sezione). Comunque cercherò, tempo permettendo, di aggiungere via via degli esempi in coda a questo "articolo"
Ultima parte di questa breve guida (non esaustiva) sul mod_rewrite di Apache.
In questo appuntamento vedremo qualche esempio di utilizzo "on the read" del mod_rewrite e qualche spiegazione conclusiva.
Passiamo subito all'azione quindi...
7.1. La RewriteCondUn po' lasciata in disparte fino a questo momento, adesso analizzeremo in maniera un po' più approfondita la RewriteCond, istruzione fondamentale del modulo mod_rewrite (diciamo che la coppia RewriteCond + RewriteRule ci permette già di fare qualcosa di carino con il mod_rewrite).
Diciamo innanzitutto che la RewriteCond si comporta un po' come un semaforo, nel senso che se l'espressione (dopo vedremo come deve essere composta) è vera allora si esegue/eseguono le RewriteRule successive (fino al flag [L] o al termine del file in caso non ci sia altro dopo), altrimenti le istruzioni RewriteRule vengono saltate.
Grazie alla RewriteCond, possiamo quindi creare un solo file .htaccess che contiene però più "istruzioni" per il mod_rewrite e discriminare di volta in volta quale azione deve intraprendere mod_rewrite.
In conclusione quindi un file .htaccess "ben formato" (per quanto concerne le finalità di questa guida) ha la seguente struttura
RewriteCond espressione1
RewriteRule1
RewriteRule2
RewriteRule...
RewriteRuleN [L]
RewriteCond espressione2
RewriteRule1
RewriteRule2
RewriteRule...
RewriteRuleN [L]
...
RewriteCond espressioneN
RewriteRule1
RewriteRule2
RewriteRule...
RewriteRuleN [L]
Una nota importante: ovviamente non c'è un limite al numero di RewriteCond (e quindi RewriteRule) che potete inserire nel file .htaccess. Va da se però che, come sempre in questi casi, il buon senso vi deve suggerire di non esagerare con le sezioni, altrimenti apache diventerà decisamente lento nel fare il parsing del file7.2. La struttura della RewriteCondOra che abbiamo visto quale sia l'utilità della RewriteCond vediamo come utilizzarla
Il formato della RewriteCond è il seguente
RewriteCond StringaDaTestare Pattern
dove StringaDaTestare è "il valore della variabile" che viene passata al mod_rewrite, mentre Pattern indica una condizione (tipicamente ancora con RegEx come abbiamo visto nella parte precedente della guida) che deve essere verificata affinchè le successive RewriteRule vengano eseguite.
Un esempio vale sicuramente più di mille parole percui...
RewriteRule REQUEST_URI http:\/\/miosito\.it
se l'URL visitato dall'utente è
http://miosito.it verranno eseguite le RewriteRule (non indicate nell'esempio)
Ora, cosa si può mettere come StringaDaTestare?
Alcune variabili predefinite sono le seguenti:
- REQUEST_URI: contiene l'URL richiesto dall'utente (insomma quello che viene digitato nella barra degli indirizzi del browser del visitatore)
- HTTP_USER_AGENT: contiene una stringa identificativa del browser usato dall'utente per visitare il sito (
attenzione: la stringa che identifica un browser non è uno standard, ma ogni browser può presentarsi con una stringa diversa. A volte anche lo stesso browser ha delle stringhe identificative diverse a seconda della versione. Inoltre tenete presente che alcuni browser permettono di modificare la stringa con cui si identificano, percui non basatevi esclusivamente sulla HTTP_USER_AGENT per effettuare dei controlli sul programma usato dall'utente)
- REMOTE_ADDR: contiene l'indirizzo IP del visitatore
- REQUEST_METHOD: contiene la modalità usata per accedere alla pagina (es. GET, HEAD, POST, PUT)
- QUERY_STRING: contiene la parte "query" di un indirizzo (in poche parole quello che viene dopo il ?)
Sfruttando queste (e molte altre) variabili potete ad esempio:
- visualizzare una pagina diversa a seconda del browser utilizzato dall'utente (se si usa Internet Explorer 7 visualizzate la pagina con flash, immagini, suoni ecc ecc; se si usa un browser testuale con lynx potete reindirizzare il visitatore ad una pagina di solo testo, tipicamente più leggera da caricare) -> HTTP_USER_AGENT
- impedire ad un IP (o una classe di IP) di visitare il vostro sito (
attenzione in questo caso a quali IP "bannate", potreste non ricevere più alcuna visita sul vostro sito perchè avete bannato il mondo intero) -> REMOTE_ADDR
- impedire che venga passato qualsiasi parametro alle vostre pagine php -> QUERY_STRING
8. Esempi conclusiviEccoci finalmente ad una rassegna di esempi per mettere in pratica tutto quello che abbiamo imparato sino ad ora
Esempio 1:
Vogliamo reindirizzare tutte le richieste index.html su index.php
RewriteCond %{REQUEST_URI} ^/index.html
RewriteRule ^(.*)$ /index.php [L,NC]
Esempio 2:
Questa è una cosa che chiedono in molti, come realizzare una pagina personale per ogni utente iscritto.
NOTA: con mod_rewrite non è possibile fare dei veri e proprio domini di terzo livello (del tipo mionome.miosito.it), ma possiamo comunque realizzare qualcosa di decisamente più comodo da scrivere rispetto a
www.miosito.it/utenti/pagine/personali/12312421.htmSupponiamo quindi che nel nostro sito abbiamo una pagina login.php che accetta come parametro l'ID dell'utente. L'indirizzo sarebbe qualcosa del tipo
www.miosito.it/login.php?ID=numero. Noi possiamo trasformarla in qualcosa del tipo
www.miosito.it/ID.htm. Certo non è come un vero e proprio dominio di terzo livello, ma c'è comunque meno da ricordare (e quindi meno errori probabili)
RewriteCond %{REQUEST_URI} ^([0-9]{8,8})\.htm
RewriteRule ^([0-9]{8,8})\.htm$ /login.php?ID=$1 [L,NC]