I file .htaccess consentono di effettuare modifiche alla configurazione di Apache che si applichino in maniera specifica ad una particolare directory (e alle sue subdirectory) per la quale esista una stanza di tipo <Directory>
in httpd.conf.
Le direttive che si possono usare all'interno di questi file hanno, in generale, la stessa sintassi del file di configurazione principale di Apache httpd.conf, sebbene non tutte le direttive ammesse in httpd.conf possono comparire in un file .htaccess. Oltre ad alcune limitazioni generali, l'amministratore del server può limitare ulteriormente le categorie di direttive consentite, mediante la direttiva AllowOverride
, oppure specificare le singole direttive consentite mediante la direttiva AllowOverrideList
.
Specificando AllowOverride none
e AllowOverrideList none
, il supporto ai file .htaccess viene disattivato per la directory in questione.
Si consideri il seguente esempio:
<Directory/www/htdocs/example/>
AllowOverride AuthConfig Indexes
</Directory>
<Directory/www/htdocs/example2/>
AllowOverride All
</Directory>
Con questa sintassi, facciamo sì che tutte le direttive che non si trovano nei gruppi AuthConfig
e Indexes
, se usate in un file .htaccess posto nella directory /www/htdocs/example, causeranno un internal server error. Per la directory /www/htdocs/example2, invece, sono consentite tutte le direttive di override.
Come e quando usare i file .htaccess
In generale, bisognerebbe utilizzare i file .htaccess
soltanto quando non è possibile inserire le direttive desiderate all'interno del file di configurazione principale - ad esempio, se i fornitori di contenuti hanno necessità di fornire accesso di root al sistema server e non hanno accesso con privilegi amministrativi al sistema: ciò succede molto spesso nel caso di shared hosting.
Rimane comunque preferibile centralizzare le direttive ove possibile, sia per ragioni di performance che di sicurezza.
In primis, se è concesso l'uso di file .htaccess, httpd li cercherà in ogni directory che incontrerà nel suo percorso fino alla risorsa richiesta. Per esempio, se si richiede la risorsa /www/htdocs/example
, httpd cercherà i seguenti file:
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
È opportuno notare come le direttive verranno applicate precisamente nell'ordine di apertura dei file trovati. Per esempio, le direttive in /www/htdocs/example/.htaccess
sovrascriveranno eventualmente quelle definite in /www/htdocs/.htaccess
e via dicendo, fino ad httpd.conf.
Nel caso si faccia uso di direttive RewriteRule
, che riscrivono gli URL in base ad espressioni regolari, ogni richiesta di una risorsa comporterà una loro ricompilazione, mentre la compilazione sarebbe avvenuta una sola volta se si fossero trovate all'interno di httpd.conf. Inoltre, le regole in sè possono diventare più complicate da scrivere a causa della loro limitazione a un singolo sottoalbero di directory; infatti, le regole verranno considerate come relative alla directory corrente, piuttosto che alla URL originariamente richiesta. Si considerino i seguenti esempi, tratti dalla documentazione ufficiale di Apache:
# In httpd.conf
RewriteRule "^/images/(.+)\.jpg" "/images/$1.png"
# In .htaccess nella directory root
RewriteRule "^images/(.+)\.jpg" "images/$1.png"
# In .htaccess in images/
RewriteRule "^(.+)\.jpg" "$1.png"
In un file .htaccess posto in una data directory, la slash iniziale viene rimossa dal valore fornito in RewriteRule
. Se il file .htaccess è invece posto direttamente nella subdirectory images, la sequenza /images/
non può chiaramente essere presente nel pattern, e va rimossa dal risultato.
La seconda considerazione riguarda la sicurezza del server: dal momento che si concede la possibilità a terzi di alterare, per quanto in maniera localizzata, il funzionamento del server, è opportuno limitare gli override consentiti a quelli strettamente necessari, e avvertire gli utenti.
AllowOverride: Categorie di direttive ammesse
Abbiamo già visto in precedenze che se la direttiva AllowOverride
viene impostata ad All
, ogni direttiva sarà ammessa all'interno del file .htaccess
.
Per una maggiore granularità, sono inoltre definiti i seguenti contesti:
Nome contesto | Descrizione |
---|---|
AuthConfig |
Consente l'uso di direttive relative all'autorizzazione (AuthDBMGroupFile , AuthDBMUserFile , AuthGroupFile , AuthName , AuthType , AuthUserFile , Require , etc.) |
FileInfo |
Consente l'uso di direttive relative ai tipi di documento (ErrorDocument , ForceType , LanguagePriority , SetHandler , SetInputFilter , SetOutputFilter , e le direttive Add* e Remove* del modulo mod_mime ) e ai metadati (Header , RequestHeader , SetEnvIf , SetEnvIfNoCase , BrowserMatch , CookieExpires , CookieDomain , CookieStyle , CookieTracking , CookieName ), nonchè delle direttive di mod_rewrite (RewriteEngine , RewriteOptions , RewriteBase , RewriteCond , RewriteRule ), le direttive di mod_alias (Redirect , RedirectTemp , RedirectPermanent , RedirectMatch ), ed Action da mod_actions |
Indexes |
Consente l'uso di direttive relative all'indicizzazione della directory (AddDescription , AddIcon , AddIconByEncoding , AddIconByType , DefaultIcon , DirectoryIndex , FancyIndexing , HeaderName , IndexIgnore , IndexOptions , ReadmeName , etc.) |
Limit |
Consente l'uso di direttive relative al controllo dell'accesso all'host (Allow , Deny e Order ) |
Nonfatal=[Override|Unknown|All] |
Modifica il comportamento del server in caso di errori di configurazione, che normalmente provocano un Internal Server Error, in modo tale che non comportino errrori fatali, ma semplici warning, che verranno registrati. In particolare:
Si noti che un errore sintattico in una direttiva valida causerà comunque un Internal Server Error. È bene notare anche che la trasformazione in warning dei suddetti errori fatali può avere un impatto significativo sulla sicurezza. Per esempio, se |
Options[=Option,...] |
Consente l'uso di direttive che controllano specifiche caratteristiche della directory (Options e XBitHack ). Un segno di eguaglianza seguito da una lista separata da virgole indicherà le opzioni che possono essere impostate mediante il comando Options |