Aliasing, URL redirection e rewriting
Apache - Installazione e configurazione
Made in
 
DESCRIPTION Aliasing, redirecting e rewriting Live Discussion - Skill: 2- JUNIOR
Spesso le GET che arrivano al server web, si riferiscono a URL che non corrispondono del tutto con le risorse locali del server.
In questo caso è possibile che la richiesta:
- Venga interpretata, in modo del tutto trasparente al client, come un alias che permette di accedere alla risorsa reale sul server (aliasing)
- Sia redirezionata ad un altro URL, sia locale che remoto e venga inviato un messaggio al client di notifica sulla nuova posizione (redirecting)
- Venga manipolata e riscritta in vari modi da Apache in modo da essere gestita con flessibilità (rewriting).

Il modulo che gestisce sia il redirecting che l'aliasing è mod_alias, ma per la manipolazione avanzata di URL viene utilizzazato il modulo mod_rewrite che, a differenza del mod_alias, risulta piuttosto oneroso in quanto ad utilizzo delle risorse del sistema.


DESCRIPTION Alias e ScriptAlias Live Discussion - Skill: 3- INTERMEDIATE
La direttiva Alias permette di translare l'URL in una differente locazione locale senza che il client se ne accorga.
Questa funzionalità è molto importante poiché permette di posizionare al di fuori della DocumentRoot, esposta via Web al mondo, file come CGI o script shell.
Basic Aliasing
La direttiva Alias prevede due parametri:
URL da aliasare - il path richiesto nell'URL inviata dal client
path reale - il path, secondo il file system locale, dove si trova la risorsa richiesta.
Nell'esempio che segue tutte le richieste a http://www.dominio.it/icons/ vengono cercate da Apache nella directory locale /usr/local/apache/icons che può stare al di fuori della DocumentRoot.
Alias /icons/ /usr/local/apache/icons

Ulteriori funzionalità sono offerte dalla direttiva AliasMatch che permette un maggior controllo sulla gestione dell'aliasing tramite Regular Expressions.
Nell'esempio che segue tutte le richieste client a file .jpg in /pippo/ vengono cercate da Apache nella directory /images/icons/pippo/
AliasMatch /pippo/(.*)\.jpg$ /images/icons/pippo/$1.jpg

Per eseguire l'alias di CGI scripts è bene utilizzare la direttiva ScriptAlias, le funzionalità e la sintassi sono identiche alla direttiva Alias.
Di fatto permette di eseguire i CGI scripts senza che la direttiva ExecCGI sia specificata.
Nell'esempio che segue tutte le richieste a http://www.dominio.it/cgi-bin/ vengono cercate nella directory /usr/local/bin/cgi-bin e i file a cui si accede vengono trattati come CGI da eseguire
ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin

Anche in questo caso è possibile definire delle Regular Expression tramite la direttiva ScriptAliasMatch:
ScriptAlias /cgi-bin/(.*)\.cgi$ /usr/local/apache/cgi-bin/$1.cgi


DESCRIPTION Usare le direttiva Redirect Live Discussion - Skill: 3- INTERMEDIATE
L'alias risulta essere del tutto trasparente al client, ma se si vuole far conoscere al client un nuovo URL a cui puntare, occorre utilizzare la direttiva Redirect.
Anche il redirect viene gestito dal modulo mod_alias.
Il server processa la richiesta del client, se l'url richiesto prevede un redirect, il server invia un messaggio con lo status HTTP, che identifica la ragione del redirect

La redirezione è gestita dalla direttiva Redirect la quale richiede richiede tre opzioni:
status Lo status del redirect, cioè il messaggio HTTP che il server invia al client. Opzionale
prefix URL Il prefisso dell'URL per verificare il matching ed effettuare il redirect
Destinazione Il nuovo URL
La sintassi di base è quindi:
Redirect [staus] [prefix URL] [destinazione]
Un esempio può essere:
Redirect permanent /docs http://www.new-domain.it/docs/archive/
Questo esegue un redirect permanente per tutte le URL contenenti /docs in http://www.new-domain.it/docs/archive/

I redirect status possono essere:
permanent HTTP code: 301 Assegna in modo permanente il redirect e il client o il proxy cacha il nuovo URL e alle successive richieste viene effettuata la richiesta direttamente all'URL corretto
temp HTTP code: 302 Assegna in modo temporaneo il redirect ed il client continuerà ad effettuare le richieste al vecchio URL
gone HTTP code: 410 Di fatto non è un redirect poiché non prevede come parametri L'URL

La differenza essenziale tra permanent e temp risiede nel caching di un proxy server.
Il redirect permanent, fa in modo che sia il proxy ad eseguire il redirect nelle successive richieste, mentre quello temporaneo obbliga il proxy server ad eseguire sempre il check sull'URL originaria.
Se lo status è omesso Apache automaticamente intrepreterà il redirect come temporaneo.

Tramite la direttiva RedirectMatch è possibile eseguire un matching avanzato per eseguire il redirect, per esempio eseguire un redirect a seconda dell'estensione del file richiesto.
Segue un esempio utile per redirezionare solo le richieste di immagini ad un altro URL.
RedirectMatch (.*)\.(jpg|png)$ http://new-domain.it/images/$1.$2

Anche in questo caso è possibile specificare il tipo di redirect da eseguire (temp, permanent etc..)


DESCRIPTION Rewrite Live Discussion - Skill: 4- ADVANCED
Rewrite è una direttiva che permette di eseguire l'URL redirect come le direttive Alias e Redirect ma secondo criteri differenti e sofisticati come il nome utente autenticato, il tipo di browser o l'IP remoto.
Questa flessibilità si paga in termini di prestazioni in quanto il modulo mod_rewrite richiede molte risorse (di default è disabilitato).
Per abilitare la direttiva Rewrite occorre aggiungere la seguente riga nel file di configurazione httpd.conf oppure nel file .htaccess se è permesso l'Override:
RewriteEngine on

La direttiva per identificare le richieste da trasformare è RewriteRule, la sintassi è identica alla direttiva AliasMatch con in più la possibiltà di specificare, tramite alcuni flag (specificate alla fine della riga fra parentesi quadre), un controllo sull'esecuzione delle regole di rewrite.
La sintassi di base è:
RewriteRule url_match new_url [flags]

Esempio:
RewriteRule /images/(.*)\.gif$ /usr/local/apache/images/$1.gif

E' possibile elencare più regole di seguito:
RewriteRule /images/(.*)\.gif$ /usr/local/apache/images/$1.gif
RewriteRule /icons/(.*) /usr/local/apache/icons/$1


A differenza delle altre direttive di redirezionamento, le regole di rewriting non vengono ereditate in configurazione standard, per abilitare questa opzione occorre abilitarla a livello di configurazione inserendo nel file httpd.conf la seguente riga:
RewriteOptions inherit

Di seguito sono riportati i flag più comuni (è possibile utilizzare più flag separandoli tramite una virgola ","):
- redirect|R [=code] (force redirect) - Opzione che permette di specificare il codice di ritorno e la natura del redirect (permanente,temporaneo etc..)
- forbidden|F - Forza il forbidden (403) dell'url, quindi evita l'accesso a quella risorsa.
- last|L (last rule) - Identifica l'ultima rule che deve essere processata.
- next|N (next round) - Stoppa e restarta il processo di Rewriting.
- nocase|NC (no case) - Disailita il case sensitive delle regular expression.
- skip|S=num (skip next rule(s)) - Esegue un skip di n rules.

Esempio:
RewriteRule ^/old/(.*) /new/$1 [R=permanent,L]


DESCRIPTION Uso avanzato di rewriting Live Discussion - Skill: 5- SENIOR
La potenzialità di rewriting viene messa in evidenza quando si ha la possibilita di aggiungere, oltre all'URL matching, ulteriori condizioni per il redirect, come ad esempio la gestione di comportamenti diversi a seconda del browser utilizzato o dell'IP del client. In questo caso la direttiva RewriteRule viene affiancata da un seconda direttiva, RewriteCond che specifica le condizioni su quando eseguire il redirect.
RewriteCond
Tramite questa direttiva si ha la possibilità di testare l'environment e gestire il redirect a seconda di determinate variabili d'ambiente. Le direttive RewriteCond devono essere specificate prima delle RewriteRule e possono essere unite fra di loro semplicemente elencandole una di seguito l'altra o tramite l'operatore logico [or].
Per esempio:
RewriteCond %{REMOTE_ADDR} ^192.168\.208\.1
RewriteCond %{REMOTE_USER} pippo
RewriteRule ^/$ /internals/ [L]

Se l'indirizzo del client è 192.168.208.1 E l'utente remoto è pippo allora viene eseguita la regola di rewrite.

RewriteCond %{REMOTE_ADDR} ^192\.168\.208\.1 [or]
RewriteCond %{REMOTE_USER} pippo
RewriteRule ^/$ /internals/ [L]

L'opzione [or] fa si che se una sola condizione è vera si esegue il redirect

URL-based conditions
E' possibile aggiungere una condizione come prefisso sempre tramite la direttiva RewriteRule (senza l'utilizzo di RewriteCond) seguita dai caratteri "- [c]":
RewriteRule ^/gallery/ - [c]
RewriteRule (.*)/([^/]*)\.gif$/ $1/home.gif

Tutte le url che iniziano con /gallery/ e richiedono un file .gif vengono redirezionate all'url nome_image/home.gif

Check e Opzioni particolari
E' possibile tramite il segno "!" negare il significato di una regular expression oppure invertire il significato di una condizione:
RewriteCond %{REMOTE_ADDR} ^192\.168\.*
Esegue la RewriteRule se l'ip del client e' 192.168.*
RewriteCond %{REMOTE_ADDR} ! ^192\.168\.*
Esegue la RewriteRule se l'ip del client non e' 192.168.*

Ecco un elenco delle opzioni più comuni:
-f Interpreta la test string come un path di un file e verifica che esista:
RewriteCond /home/%{REMOTE_USER}/index.html -f
-d Interpreta la test string come un path di un directory e verifica che esista:
RewriteCond /home/%{REMOTE_USER}/ -d
-s Interpreta la test string come il path di un file e verifica che la sua dimensione non sia zero
-l Interpreta la test string come il path di un file e verifica che sia un symblic link
< "text" Verifica che la test string sia minore di "text"
> "text" Verifica che la test string sia maggiore di "text"
= "text" Verifica che la test string sia uguale a "text"

Tramite la direttiva RewriteCond è possibile estrarre il valore di alcune variabili settate nell'environment ed associarle alla direttiva RewriteRule identificandole con %1,%2 e cosi via. Per esempio:
RewriteCond %{LA-U:REMOTE_USER} ^(.*)$
RewriteRule ^/user-status(.*)$ /cgi/bin/userstatus.cgi$1?user=%1


Se si ha la necessità di specificare molte regole di rewriting o regole che devono essere applicate in casi specifici è conveniente utilizzare le rewrite map.
Le rewrite map sono inizializzabili tramite la direttiva RewriteMap con la seguente sintassi:
RewriteMap name type:source
Per esempio:
RewriteCond ${LA-U:REMOTE_USER} ^(.*)$
RewriteMap servers txt:/usr/local/apache/map-peruser/%1.map

Le rewriteMap possono essere dei semplici file di testo, dei DBM database, un programma esterno o una funzione interna.


  Openskills LiveBook: Apache - Installazione e configurazione | (C)oresis Srl | GNU FDL licence Generated: 23/10/2003