.htaccess è il file che controlla il webserver Apache; è molto utile e permette di fare un sacco di cose. In questo articolo, ho raccolto alcuni frammenti per il file .htaccess che ogni sviluppatore web dovrebbe avere nella sua cassetta degli attrezzi.

Prima di modificare il file .htaccess, eseguire sempre un backup in modo da poterlo ripristinare in caso di necessità.
Aggiungi automaticamente il charset utf-8 ai files
Al fine di evitare problemi di codifica è possibile forzare una codifica specifica direttamente sul vostro file .htaccess. In questo modo, si potrà garantire che i vostri documenti HTML verranno sempre renderizzate correttamente, anche se dimenticate di aggiungere la direttiva <meta http-equiv=”Content-Type”> sulle tue pagine html. (fonte [icon name=”external-link” class=”” unprefixed_class=””])
Copia codice

#
<FilesMatch "\.(htm|html|css|js)$">
AddDefaultCharset UTF-8
</FilesMatch>
#
Forzare lo slash finale negli URL
Imporre lo slash finale su tutti gli URL, dal punto di vista SEO è molto utile e ai visitatori dà una sensazione di uniformità, visto che sito-web.com/cartella è diverso da sito-web.com/cartella/. A tale scopo basta fare uso del seguente codice nel file .htaccess
Copia codice

#
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
#
Rimuovere www dall'url
Per motivi di SEO, si potrebbe sempre rimuovere (o usare) il prefisso www nel vostro URL. Il frammento seguente toglie il www dal vostro URL del sito web e reindirizza qualsiasi url con www alla versione non-www. (fonte [icon name=”external-link” class=”” unprefixed_class=””])
Copia codice

#
RewriteEngine On
RewriteCond %{HTTP_HOST} !^sito-web.com$ [NC]
RewriteRule ^(.*)$ http://sito-web.com/$1 [L,R=301]
#
Al contrario, se vogliamo aggiungere il prefisso www quando nell’url viene omesso.
Copia codice

#
RewriteEngine On
RewriteCond %{HTTP_HOST} ^sito-web.com [NC]
RewriteRule ^(.*)$ http://www.sito-web.com/$1 [L,R=301]
#
Rimuovere le estensioni dei file dagli URL
Le estensioni dei file possono essere utili per gli sviluppatori, ma non c’è assolutamente bisogno di vederli per i tuoi visitatori. Questo frammento rimuoverà l’estensione .html su qualsiasi file html. Naturalmente, questo codice può essere facilmente adattato per rimuovere le estensioni da altri file come .php. (fonte [icon name=”external-link” class=”” unprefixed_class=””])
Copia codice

#
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
# Sostituire html con  altraestensione di file
# ad esempio: php, htm, asp
#
Prevenire elenco di directory
Sul server web, quando una directory non dispone di un file index, Apache crea automaticamente un elenco di tutti i file della directory corrente. Se non vuoi che chiunque possa vedere quali file sono sotto la cartella corrente sul server, basta aggiungere il codice seguente al tuo file .htaccess per impedire visualizzazione della lista automatica della directory.
Copia codice

#
Options -Indexes
#
Prevenire lo hotlinking
Hotlinking è una cattiva pratica che consiste in utilizzare le immagini da un altro sito su quello proprio. Quando sei hotlinkato da qualcun altro, la larghezza di banda viene utilizzata per un profitto altrui. Naturalmente, si consiglia di evitare gli hotlinkers. Basta aggiungere il seguente frammento al tuo file .htaccess per sostituire le richieste di determinati tipi di file dall’esterno con un altro, magari da pochi bites.
Copia codice

#
RewriteEngine On
#Replace ?sito-web\.com/ con il vostro URL del blog
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?sito-web\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
#Replace /images/nohotlink.jpg con url della immagine "no hotlink"
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
#
Abilitare i video di HTML5 sul sito
HTML5 offre grandi potenzialità tra cui la possibilità di inserire video in streaming senza bisogno del supporto di Flash. Ecco come fare per abilitare questa feature mediante .htaccess
Copia codice

#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
AddType video/ogg .ogv
AddType video/ogg .ogg
AddType video/mp4 .mp4
AddType video/webm .webm
AddType application/x-shockwave-flash swf
#
Permettere l'embed di un font
Anche se si può ricorrere a Google Font senza dover configurare nulla, l’embed del font dai file esterni al vostro sito deve essere abilitato, in caso contrario alcuni browser come Firefox non li caricano.
Copia codice

#
<FilesMatch "\.(ttf|otf|eot|woff)$">
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://sito-web.com"
</IfModule>
</FilesMatch>
#
Lanciare codice PHP dentro dei file JavaScript
Il modo più semplice per assegnare un valore ad una variabile dentro di un file .js è il seguente var jsVar = "";, ma in alcuni casi può essere comodo poter lanciare file PHP direttamente dentro file JS.
Per fare questo potete fare uso del seguente frammento.
Copia codice

#
AddType application/x-httpd-php .js
AddHandler x-httpd-php5 .js
<FilesMatch "\.(js|php)$">
SetHandler application/x-httpd-php
</FilesMatch>
#
Creare pagine di errore personalizzate
Stanchi delle vecchie pagine errori del tuo sito? Basta creare alcuni file html con l’aspetto desiderato, caricarli sul tuo server, e aggiungere quanto segue al file .htaccess. (fonte [icon name=”external-link” class=”” unprefixed_class=””])
Copia codice

#
ErrorDocument 400 /errors/badrequest.html
ErrorDocument 401 /errors/authreqd.html
ErrorDocument 403 /errors/forbid.html
ErrorDocument 404 /errors/notfound.html
ErrorDocument 500 /errors/serverr.html
#
Log errori di PHP
Questo frammento è un modo interessante per registrare gli errori generati dal file php in un file di log. Basta creare un file php_error.log, salvarlo in qualche parte sul vostro server e aggiungere il seguente frammento al tuo file .htaccess. Non dimenticare di modificare il percorso del file di registro sulla linea 8. (fonte [icon name=”external-link” class=”” unprefixed_class=””])
Copia codice

#
# display no errs to user
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
# log to file
php_flag log_errors on
php_value error_log /percorso/verso/php_error.log
#
Ridurre il peso delle pagine compremendo i dati statici
Lo sai che è possibile inviare dati compressi ai visitatori, che sarà poi decompresso dal cliente? Questo codice vi farà sicuramente risparmiare (e il vostro visitatore) la larghezza di banda e ridurre il peso pagine.
Copia codice

#
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
#
Download obbligato di alcuni tipi di file
Per fare in modo che i vostri visitatori possano scaricare dei file di un certo tipo quando ci cliccano sopra, senza vederlo dentro al browser come succede con il file .pdf.
Copia codice

#
<Files *.xls>
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</Files>
<Files *.pdf>
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</Files>
#
Impostare la caching per velocizzare il tuo sito
La velocità di caricamento del sito è un vero e proprio fattore di ranking ed è una delle recommendation preferite da Google. Alcuni file statici come possono essere le immagini, il fogli di stile (css), ecc. possono una scadenza di validità per recuperarli dalla cache. Per ottenere questo risultato inserire il seguente codice.
Copia codice

#
# 1 ANNO
<FilesMatch "\.(ico|pdf|flv)$">
Header set Cache-Control "max-age=29030400, public"
</FilesMatch>
# 1 SETTIMANA
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>
# 2 GIORNI
<FilesMatch "\.(xml|txt|css|js)$">
Header set Cache-Control "max-age=172800, proxy-revalidate"
</FilesMatch>
# 1 MINUTO
<FilesMatch "\.(html|htm|php)$">
Header set Cache-Control "max-age=60, private, proxy-revalidate"
</FilesMatch>
#
Bloccare lo spam sul tuo sito in WordPress
Quasi tutti gli spam di WordPress arriva dall’accesso diretto al file wp-comments-post.php, utilizzato dagli spam-bot per mandarvi commenti e link spazzatura. Perchè allora non impedire a loro l’accesso? Con queste righe di codice si evita questi accessi indesiderati.
Copia codice

#
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
RewriteCond %{HTTP_REFERER} !.*nometuodominio.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$ RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
#
Reindirizzare tutti i feed FeedBurner di WordPress
La maggior parte dei blogger utilizzano Feedburner: un servizio web che consente di sapere quante persone stanno leggendo il tuo blog via feed. Se usate WordPress è necessario reindirizzare tutti i feed WordPress (RSS, Atom, ecc) su FeedBurner. Modificare il percorso sulle linee 3 e 4, e quindi incollare il codice al tuo file .htaccess. (fonte [icon name=”external-link” class=”” unprefixed_class=””])
Copia codice

#
<IfModule mod_alias.c>
 RedirectMatch 301 /feed/(atom|rdf|rss|rss2)/?$ http://feedburner.com/yourfeed/
 RedirectMatch 301 /comments/feed/(atom|rdf|rss|rss2)/?$ http://feedburner.com/yourfeed/
</IfModule>
#
Unificare i formati feed RSS
Sembrerebbe che i RSS sia diventato uno standard, quindi unificare i vari RSS (RSS, Atom e Rdf) sarebbe utile. Il seguente frammento di codice htaccess può essere utilizzato a tale scopo.
Copia codice

#
<IfModule mod_alias.c>
 RedirectMatch 301 /feed/(atom|rdf|rss|rss2)/?$ http://sito-web.com/feed/
 RedirectMatch 301 /comments/feed/(atom|rdf|rss|rss2)/?$ http://sito-web/comments/feed/
</IfModule>
#
Redirect al sito mobile
È possibile redirezionare al vostro sito mobile i dispositivi abilitati che visitano il sito in modo automatico con una piccola manipolazione del file .htaccess.
Copia codice

#
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/m/.*$
RewriteCond %{HTTP_ACCEPT} "text/vnd.wap.wml|application/vnd.wap.xhtml+xml" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "acs|alav|alca|amoi|audi|aste|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "dang|doco|eric|hipt|inno|ipaq|java|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-" [NC,OR]
RewriteCond %{HTTP_USER_AGENT}  "maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|opwv" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "palm|pana|pant|pdxg|phil|play|pluc|port|prox|qtek|qwap|sage|sams|sany" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|w3cs|wap-|wapa|wapi" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "wapp|wapr|webc|winw|winw|xda|xda-" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "up.browser|up.link|windowssce|iemobile|mini|mmp" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "symbian|midp|wap|phone|pocket|mobile|pda|psp" [NC]
#------------- The line below excludes the iPad
RewriteCond %{HTTP_USER_AGENT} !^.*iPad.*$
#-------------
RewriteCond %{HTTP_USER_AGENT} !macintosh [NC] #*SEE NOTE BELOW
RewriteRule ^(.*)$ /m/ [L,R=302]
#
Conclusione
No pretende essere una lista esaustiva delle possibilità che ci offre la configurazione del server web Apache attraverso il file .htaccess, ma si un elenco di quelle più utilizzate e che, in varie occasioni, ho avuto bisogno di documentarmi. Se in futuro avrò neccessità di nuovi le aggiungerò a questa lista magari in una pagina figlia.