Se lavoriamo col web server Apache, o abbiamo portato online qualche sito o applicazione web, ci è capitato quasi sicuramente di dover creare, modificare o deployare il file .htaccess di Apache. All'interno di questo file possiamo specificare molte delle direttive di Apache, le stesse che si trovano nel file apache.conf o httpd.conf. Nelle scorse puntate (vedi qui) abbiamo visto quali solo le direttive più usate per configurare Apache. Oggi vogliamo dedicarci a quella che forse è la direttiva più importante, sia quando configuriamo Apache, sia quando modifichiamo un file .htaccess: la direttiva Directory.

All'interno del file di configurazione di Apache dovrebbe sempre trovarsi una direttiva del tipo

<Directory />

...

</Directory>

la direttiva riguarda la root del server perché il percorso “/” è specificato subito dopo la keyword Directory: ciò significa che la direttiva si applica alla root del server, ovvero a tutte le risorse presenti sotto il percorso definito nella DocumentRoot, incluse le eventuali sotto directories.

Se vogliamo applicare una direttiva Directory ad un particolare percorso, basterà scrivere (su Windows è bene delimitare il percorso tra “doppi apici”) qualcosa come

<Directory /usr/local/httpd/mysite>

</Directory>

Questo dovrebbe farci capire perché la direttiva Directory è così importante: si tratta di una “meta direttiva”, che non riguarda una regola particolare di Apache, ma permette invece di specificare quando applicare un gruppo di direttive. Se pensiamo alle direttive come ad un mazzo di carte da gioco, la direttiva Directory dice a quale “giocatore” (leggi: sito o percorso nel file system) va assegnato un'intera mano di carte (leggi: gruppo di direttive). All'interno della direttiva Directory possiamo inserire molte direttive diverse, e caratterizzare così il comportamento del singolo sito o applicazione. Tanta libertà potrebbe disorientare: andiamo perciò a vedere quali sono le direttive usate più spesso all'interno dell'elemento Directory.

Options

Permette di specificare molti comportamenti diversi, che riguardano quali script possono essere eseguiti lato server (ExecCGI), come gestire i link simbolici (FollowSymLinks e SymLinksIfOwnerMatch), i tipi di include permessi lato lato server (Includes e IncludesNOEXEC), le modalità di negoziazione dei contenuti (MultiViews) e come vanno visualizzati le directory sprovviste di una index.html (Indexes). Se lavoriamo in locale, possiamo tranquillamente scegliere il valore Options All che attiva tutte le modalità che abbiamo elencato. Se invece dobbiamo amministrare un server remoto, non possiamo esimerci dallo studiare bene questa direttiva.

AllowOverride

Direttiva molto importate per le applicazioni in hosting remoto. Se questa direttiva è settata su None, tutti i files .htaccess sotto la directory in questione saranno ignorati. Esistono diversi modi di configurare dove e quando è permesso l'override tramite un file .htaccess, non possiamo discuterli tutti in queste sede. Ci basta invece ricordare che, se un file .htaccess tenta di eseguire un override non consentito, nella maggior parte dei casi avremo un internal server error.

Order, Deny e Allow

Sono tre direttive diverse, ma vale la pena vederle assieme. La direttiva Order decide con quale priorità considerare le altre due, e può assumere solo due valori: Deny,Allow (le richieste “dubbie” vengono accettate) oppure Allow,Deny (le richieste “dubbie” vengono respinte). Per richieste “dubbie” si intendono tutte quelle non regolamentate da qualche regola di tipo Allow o Deny (o da entrambe). Alcuni esempi dovrebbero chiarire l'uso combinato delle tre direttive

Order Deny,Allow
Deny from all
Allow from aziendeitalia.com

significa che le uniche richieste accettate sono quelle provenienti dal dominio aziendeitalia.com. Notiamo che in questo caso non esistono richieste dubbie e ambigue, perché la direttiva Deny from all è chiara quanto imperativa: tutto ciò che non è regolamentato va rifiutato.

Lo stesso risultato si potrebbe ottenere scrivendo

Order Allow,Deny
Allow from aziendeitalia.com
Deny from ilmiosito.com

infatti in tal caso tutte le richieste “dubbie” (ovvero quelle che non provengono né da AziendeItalia, né dal “mio sito”) saranno scartate perché abbiamo scelto l'impostazione meno permissiva (cioè Order Allow,Deny), che respinge tutto ciò che non soddisfa una qualsiasi regola.

Dovrebbe essere chiaro che non è possibile riassumere in poche pagine tutte le potenzialità offerte dalla direttiva Directory. Nelle prossime puntate vedremo alcuni esempi specifici, sperando di coprire almeno i casi più frequenti per chi lavora sul web. Vale però la pena, prima di concludere, accennare a cosa succede se un percorso del file system viene descritto da più direttive Directory. Consideriamo ad esempio

<Directory /> ecc... ecc...</Directory>

<Directory /mysite> ecc... ecc...</Directory>

in questo caso al percorso /mysite si applicano entrambe le direttive, perché la directory mysite si trova sotto l'albero della root (regolata dalla direttiva <Directory />). Per risolvere ambiguità come questa Apache assegna la priorità al percorso più breve: siccome la stringa “/” è più breve delle stringa “/mysite”, le istruzioni della prima riga verranno applicate prima di quelle della seconda riga. Il discorso cambia se specifichiamo il percorso a cui fa riferimento la direttiva usando un'espressione regolare: direttive di questo tipo sono valutate dopo le direttive normali, e dopo gli eventuali file .htaccess. Per questo motivo, almeno all'inizio, sconsigliamo di lavorare con le espressioni regolari, ma di identificare i percorsi delle directory in maniera esplicita.