.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 )
#
<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
#
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 )
#
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.
 
#
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 )
#
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.
#
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.
#
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
#
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.
#
<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.
#
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 )
#
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 )
#
# 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.
#
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.
#
<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.
#
# 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.
#
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 )
#
<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.
#
<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.
#
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.
Similari
Guida allo Zend Framework
9% Zend
Zend Framework è un framework open source per PHP. Zend Framework separa la logica e le azioni usando il pattern MVC (Model View Controller). Cosa è lo Zend Framework? Framework per la costruzione di siti web più veloci e …
redirect 301 usando mod_alias
8% Server
mod_alias è fondamentalmente la versione più semplice di mod_rewrite. Non può fare le cose che fa mod_rewrite, ad esempio modificare la stringa di query. Per eseguire reindirizzamenti nel server web Apache è possibile di u…
Restrizioni per caricare un file con PHP
8% Php
Dalle foto di famiglia ai documenti aziendali, file uploads potenzia molte delle applicazioni web più importanti. [expand title=”L’oggetto $_FILES” startwrap=”” endwrap=”” excerpt=”⤽” swapexcerpt=”” expanded=”true” trigcla…
Il CDN di Google per distribuire il codice jQuery
6% JQuery
Troppo spesso, trovo del codice simile al seguente quando ispeziono il codice sorgente dei siti web che utilizzano jQuery: <script type="text/javascri…
Parsing XML con SimpleXML
6% Php
Analizzare l’XML significa essenzialmente la navigazione attraverso un documento in formato XML per la restituzione dei dati pertinenti. Un numero crescente di servizi web restituiscono i dati in formato JSON, ma un gran n…