In queste pagine vedremo come Apache ci permetta di "giocare" con gli URL intervenendo non appena una prefissata richiesta HTTP giunga al nostro server. Il modulo che rende possibile tutto ciò è mod_alias
compilato di default. Per manipolazioni più complesse si può ricorrere ad un altro modulo, mod_rewrite
, ma non sarà oggetto della trattazione. In pratica analizzeremo due aspetti: l'aliasing ed il redirect. Nel primo caso mapperemo una parte del file system su un'altra, nel secondo effettueremo un rindirizzamento dell'URL.
Prima di proseguire, a scanso di equivoci, un piccolo chiarimento: ogni direttiva di Apache, come saprete, ha un contesto d'azione a partire dal più generale sino al particolare. Schematizzando avremo:
-
server-config: indica una direttiva che può comparire in un qualunque punto del file http.conf, essa avrà un influenza globale sul comportamento del web server;
-
contenitore: ad esempio
<Virtualhost></Virtualhost>
,<Directory></Directory>
,<Files></Files>
e così via. In questo caso l'ambito d'azione viene ristretto al contenitore che racchiude la direttiva. Nel primo esempio sarà l'host virtuale, poi una directory e le sue sottodirectory, ed infine uno o più file. -
per-directory: in questo caso si tratta delle direttive che possono essere incluse in file
.htaccess
(nome usato di default). Tale file viene letto "al volo" da Apache non appena riceve una richiesta per la directory in cui si trova. In poche parole è l'ancora di salvezza per chi non ha accesso ai file di configurazione del web server.
Di seguito parlando di contesto o livello della direttiva ci riferiremo a quanto sopra menzionato. Cominciamo con l'affrontare l'aliasing.
Alias ed AliasMatch
La sintassi della direttiva Alias è:
Alias percorso-URL percorso
Dove con "percorso-URL" si intende il percorso che compare nell'URL richiesto dal client, mentre "percorso" rappresenta un path reale nel file system. Essa permette di rendere disponibili documenti che non si trovano sotto la Document Root, ma in un percorso alternativo del nostro server. La direttiva può essere usata a livello di server-config o virtual host. Facciamo un esempio:
Alias /pubdocs /home/ermanno/documents
Questo significa che se arriva una richiesta per http://www.miosito.it/pubdocs/file.txt Apache la mapperà su /home/ermanno/documents/file.txt. Naturalmente senza che il client si renda conto di nulla. Attenzione a come realizziamo il tutto, non vogliamo certo rendere disponibili porzioni del nostro file system a tutto il web! Se nella definizione dell'alias usiamo la "/" finale cioè:
Alias /pubdocs/ /home/ermanno/documents/
la richiesta http://www.miosito.it/pubdocs non subirà l'alias ma solo la http://www.miosito.it/pubdocs/.
Le applicazioni possono essere innumerevoli vediamo ad esempio come "trasformare" la richiesta per un CSS in una chiamata ad un file PHP che generi dinamicamente il foglio di stile:
Alias /my.css /path_to_document_root/css/mycss.php
AliasMatch, simile alla precedente, risulta più potente permettendo l'uso delle espressioni regolari, la sintassi è:
AliasMatch regex percorso
In altre parole possiamo ricorrere alla versatilità delle espressioni regolari per esprimere l'URL di cui fare l'alias. Nell'esempio che segue la richiesta per un'immagine di tipo PNG contenuta nella directory images viene convertita in una chiamata ad uno script PHP.
AliasMatch /images/(.*).png /path_to_document_root/lib/manage_images.php
In questo modo nel soddisfare la richiesta del client possiamo compiere alcune elaborazioni come ad esempio recuperare l'immagine memorizzata in database o ridimensionarla al volo. Sfruttando variabili quali $_SERVER['REQUEST_URI']
o $_SERVER['PHP_SELF']
sarà semplice per manage_images.php ottenere il nome dell'immagine richiesta.
ScriptAlias ed ScriptAliasMatch
Sono direttive analoghe alle precedenti con un'unica importante differenza: il file richiesto nell'URL viene trattato come uno script CGI e gestito di conseguenza dal server attraverso mod_cgi. Il contesto di utilizzo risulta ancora server-config e virtual host. Di seguito la sintassi:
ScriptAlias percorso-URL percorso
ScriptAliasMatch regex percorso
Immaginiamo di volere che una richiesta del tipo http://www.miosito.it/script/script.pl ottenga come effetto l'esecuzione dello script /web/script/script.pl possiamo procedere così:
ScriptAlias /script /web/script
ScriptAliasMatch ci può evitare di scrivere più direttive ScriptAlias raggruppando tutto in un'unica espressione regolare. L'esempio seguente permette di mappare le richieste http://www.miosito.it/script/, http://www.miosito.it/Script/ in chiamate a CGI che si trovano nella directory /web/cgi/:
ScriptAliasMatch ^/[sS]cript/ /web/cgi/
Redirect e RedirectMatch
Tali direttive rindirizzano una richiesta per un URL verso un diverso URL. Vediamo la sintassi di Redirect:
Redirect [stato] vecchio-URL nuovo-URL
Il primo argomento, opzionale, permette di specificare il codice di stato HTTP restituito al client. Se non si specifica nulla viene restituito lo stato di rindirizzamento temporaneo 302. Con "vecchio-URL" si intende l'URL richiesto dal client e con "nuovo-URL" l'URL verso cui viene rindirizzato. Il codice di stato può essere espresso mediante parole chiave:
-
Permanent: rindirizzamento permanente codice 301.
-
Temp: rindirizzamento temporaneo, 302.
-
See other: corrisponde allo stato 303 la risorsa è stata sostituita.
-
Gone: 410, la risorsa richiesta è stata rimossa in questo caso il nuovo URL va omesso.
In alternativa possiamo fornire i codici in formato numerico: se sono compresi tra 300 e 399 il nuovo URL andrà indicata in caso contrario andrà omessa. Ci si potrebbe chiedere coma mai questa duttilità della direttiva, in effetti ancora oggi i client non sfruttano a pieno la molteplicità di risposte ricevute, ma, ad esempio, un server proxy che riceve una risposta di rindirizzamento permanente potrà memorizzare e fornire direttamente il nuovo URL.
Passiamo ad un esempio:
Redirect permanent /documents http://www.mionuovosito.com/documents
In questo modo una richiesta per http://www.miosito.it/documents/file.txt verrà rindirizzata su http://www.mionuovosito.com/documents/file.txt. Un utilizzo comune è quello di perdere l'indicizzazione del vecchio sito segnalando allo spider del motore di ricerca l'analoga risorsa permanentemente spostata sul nuovo sito:
Redirect 301 / http://www.mionuovosito.com/
Redirect ha un contesto d'applicazione molto ampio: server-config, host virtuale, directory, per-directory. Si potrà, quindi, sfruttarla anche all'interno di un file .htaccess.
RedirectMatch, come sarà ormai chiaro, estende le funzionalità della precedente permettendo il ricorso alle espressioni regolari:
Redirect [stato] regex nuovo-URL
Il contesto è analogo a quello della sorella minore: server-config, host virtuale, directory, per-directory. Il seguente esempio rindirizza le richieste dal vecchio URL al nuovo facendo corrispondere i vecchi file .htm ai nuovi file .html. Ad esempio http://www.miosito.it/prova.htm verrà rindirizzato su http://www.mionuovosito.com/prova.html.
RedirectMatch 301 (.*).htm$ http://wwww.mionuovosito.com$1.html
In chiusura accenno solo all'esistenza delle direttive RedirectTemp e RedirectPermanent esattamente equivalenti a Redirect temp e Redirect permanent.
Conclusioni
In queste pagine abbiamo visto come Apache ci permetta con semplicità di elaborare le richieste provenienti dai client e trasformarle in modo del tutto trasparente ed indolore. I campi d'applicazione sono i più vari e sicuramente rappresentano un importante strumento per il webmaster che costretto a modificare directory, spostare risorse, variare domini o altro voglia nascondere ai propri visitatori i retroscena di tali ristrutturazioni.