Una collezione di esempi utili di .htaccess.
Disclaimer: Anche se nella maggior parte dei casi basta
copiare l’.htaccess
d’esempio ci sono casi in cui sia
necessario fare delle modifiche. L’utilizzo è a vostro totale rischio.
IMPORTANTE: Apache 2.4 introduce alcuni cambiamenti, in particolare la configurazione del controllo degli accessi. Per maggiori informazioni potete consultare il documento sull’aggiornamento oltre a questa problematica.
Ciò che stiamo facendo è mettere insieme esempi utili da tutto il web (ad esempio, una buona parte viene da Apache Server Configs) in un solo posto. Anche se abbiamo cercato di dare riconoscimento, dove previsto, potrebbe mancare qualche riferimento. Se credete che sia presente del vostro lavoro e volete che venga riconosciuto fatecelo sapere e inviateci un PR.
Nota: Si presume che mod_rewrite
sia installato e abilitato.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^esempio\.com [NC]
RewriteRule ^(.*)$ http://www.esempio.com/$1 [L,R=301,NC]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Funziona per qualsiasi dominio. Sorgente
E’ ancora aperta la discussione sul se utilizzare o meno www. Se invece preferite domini senza www:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.esempio\.com [NC]
RewriteRule ^(.*)$ http://esempio.com/$1 [L,R=301]
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|off
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$
RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
# Nota: Si consiglia di abilitare anche HTTP Strict Transport Security (HSTS)
# sul sito HTTPS per aiutare a prevenire attacchi man-in-the-middle.
# Vedere https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>
Utile se hai un proxy con TLS prima del tuo server.
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
Questo esempio redirezionerà i percorsi che finiscono con gli slash ai
rispettivi percorsi senza slash (eccetto le attuali cartelle), es.
http://www.esempio.com/blog/
in
http://www.esempio.com/blog
. E’ importante per il SEO in
quanto
raccomandato per avere
un URL canonico per ogni pagina.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
Redirect 301 /vecchiapagina.html http://www.esempio.com/nuovapagina.html
Redirect 301 /vecchiapagina2.html http://www.esempio.com/cartella/
RewriteEngine On
RewriteRule ^source-directory/(.*) /target-directory/$1 [R=301,L]
FallbackResource /index.fcgi
Questo esempio presenta un file index.fcgi
in alcune cartelle
e ogni richiesta fallita nel risolvere un file/cartella verrà inviata allo
script index.fcgi
. Va bene se volete che
baz.foo/some/cool/path
venga gestito da
baz.foo/index.fcgi
(che supporta anche richieste verso
baz.foo
) mantenendo baz.foo/css/style.css
e
simili. Accedi al percorso originale dalla variabile d’ambiente PATH_INFO
come previsto dal vostro ambiente di scripting.
RewriteEngine On
RewriteRule ^$ index.fcgi/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]
Questa è una versione meno efficiente della direttiva FallbackResource
directive (l’uso di mod_rewrite
è più complesso del gestire
la direttiva FallbackResource
) ma è anche più flessibile.
Redirect 301 / http://nuovosito.com/
Questo metodo ti permette di mantenere i collegamenti intatti. Il vecchio
indirizzo www.vecchiosito.com/some/crazy/link.html
diventerà
www.nuovosito.com/some/crazy/link.html
. E’ estremamente utile
quando ci si “sposta” verso un nuovo dominio.
Sorgente
Questo esempio ti permette di utilizzare URL “pulite” – URL senza
estensione PHP. es. esempio.com/utenti
invece di
esempio.com/utenti.php
.
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]
## Apache 2.2
Deny from all
## Apache 2.4
# Require all denied
In questa maniera rimarrai escluso anche tu dai tui contenuti! Per questo introduciamo…
## Apache 2.2
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx
## Apache 2.4
# Require all denied
# Require ip xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx
indica il tuo indirizzo IP. Se modifichi le
ultime tre cifre con, per esempio, 0/12
verrà specificato un
intervallo di IP all’interno della stessa rete, utile per non dover
inserire singolarmente tutti gli ip.
Sorgente
Ecco la versione al contrario:
## Apache 2.2
Order deny,allow
Deny from xxx.xxx.xxx.xxx
Deny from xxx.xxx.xxx.xxy
## Apache 2.4
# Require all granted
# Require not ip xxx.xxx.xxx.xxx
# Require not ip xxx.xxx.xxx.xxy
La maggior parte, se non tutti, cartelle e File nascosti (quelli con i
nomi che iniziano con il punto .
) dovrebbero essere al
sicuro. Per esempio: .htaccess
, .htpasswd
,
.git
, .hg
…
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]
In alternativa puoi inviare il messaggio “Not Found” error, giving the attacker dude no clue:
RedirectMatch 404 /\..*$
Questi file potrebbero esser stati lasciati da editor di testo o html (come Vi/Vim) e sono un possibile pericolo di sicurezza se mostrati al pubblico.
<FilesMatch "(\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$">
## Apache 2.2
Order allow,deny
Deny from all
Satisfy All
## Apache 2.4
# Require all denied
</FilesMatch>
Options All -Indexes
RewriteEngine on
# Rimuovere la riga che segue se vuoi bloccare anche i referrer vuoti
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(.+\.)?esempio.com [NC]
RewriteRule \.(jpe?g|png|gif|bmp)$ - [NC,F,L]
# Se vuoi mostrare un banner di "blocco" al posto dell'immagine collegata (hotlinked),
# sostituisci la regola precedente con:
# RewriteRule \.(jpe?g|png|gif|bmp) http://esempio.com/blocked.png [R,L]
A volte vuoi disabilitare il collegamento ad immagini del tuo sito (hotlinking) solo da alcuni cattivoni.
RewriteEngine on
RewriteCond %{HTTP_REFERER} ^https?://(.+\.)?badsite\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ^https?://(.+\.)?badsite2\.com [NC,OR]
RewriteRule \.(jpe?g|png|gif|bmp)$ - [NC,F,L]
# Se vuoi mostrare un banner di "blocco" al posto dell'immagine collegata (hotlinked),
# sostituisci la regola precedente con:
# RewriteRule \.(jpe?g|png|gif|bmp) http://esempio.com/blocked.png [R,L]
Prima è necessario creare un file .htpasswd
da qualche parte
nell sistema:
E adesso potete utilizzarlo per l’autenticazione:
AuthType Basic
AuthName "Non si entra con facilità"
AuthUserFile /home/compagnia/.htpasswd
Require valid-user
AuthName "Ancora non si entra con facilità"
AuthType Basic
AuthUserFile /home/compagnia/.htpasswd
<Files "one-ring.o">
Require valid-user
</Files>
<FilesMatch ^((one|two|three)-rings?\.o)$>
Require valid-user
</FilesMatch>
Nega l’accesso a tutti gli utenti che arrivano da (con referrer da) un dominio specifico. Sorgente
RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} undominio\.com [NC,OR]
RewriteCond %{HTTP_REFERER} unaltrodominio\.com
RewriteRule .* - [F]
Previene la possibilità di inserimento del sito web tramite frame (es.
inserito all’interno del tag iframe
) permettendo solo un URI
specifico.
SetEnvIf Request_URI "/starry-night" allow_framing=true
Header set X-Frame-Options SAMEORIGIN env=!allow_framing
<IfModule mod_deflate.c>
# Forza la compressione per header manipolati (es. da proxy).
# https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
</IfModule>
</IfModule>
# Comprimi tutto l'output segnato con uno dei seguentiMIME-type
# (per le versioni di Apache inferiori a 2.3.7 non è necessario abilitare `mod_filter`
# ed è possibile rimuovere `<IfModule mod_filter.c>` e `</IfModule>` lines
# in quanto `AddOutputFilterByType` è ancora nelle direttive principali).
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/atom+xml \
application/javascript \
application/json \
application/rss+xml \
application/vnd.ms-fontobject \
application/x-font-ttf \
application/x-web-app-manifest+json \
application/xhtml+xml \
application/xml \
font/opentype \
image/svg+xml \
image/x-icon \
text/css \
text/html \
text/plain \
text/x-component \
text/xml
</IfModule>
</IfModule>
Expires headers indicano al browser se devono richiedere il file al server o caricarli dalla cache. E’ consigliabile impostare gli header expires per i contenuti statici con una data futura abbastanza ampia. Se non controlli la versione del file in base al nome imposta la cache per risorse come CSS e JS a qualcosa come 1 settimana . Sorgente
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 year"
# Interscambio Dati
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
# Favicon (non può essere rinominato!)
ExpiresByType image/x-icon "access plus 1 week"
# componenti HTML (HTC)
ExpiresByType text/x-component "access plus 1 month"
# HTML
ExpiresByType text/html "access plus 0 seconds"
# JavaScript
ExpiresByType application/javascript "access plus 1 year"
# File Manifesto
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
# Media
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
# Feed Web
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
# Web font
ExpiresByType application/font-woff2 "access plus 1 month"
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
</IfModule>
Rimuovendo l’intestazione ETag
vegono disabilitate le cache
del browser per poter validare i file e sono forzati a far fede alle
intestazioni Cache-Control
e Expires
.
Sorgente
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
php_value <key> <val>
# Peresempio:
php_value upload_max_filesize 50M
php_value max_execution_time 240
ErrorDocument 500 "Houston, abbiamo un problema."
ErrorDocument 401 http://errore.esempio.com/mordor.html
ErrorDocument 404 /errori/halflife3.html
A volte volete poter forzare il browser a scaricare una tipologia di contenuto al posto di mostrarlo.
<Files *.md>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>
Adesso c’è lo yang a questo yin:
A volte si vuole forzare il brower a mostrare una tipologia di contenuto al posto di farlo scaricare.
<FilesMatch "\.(tex|log|aux)$">
Header set Content-Type text/plain
</FilesMatch>
I webfont messi a disposiziontra tramite CDN potrebbero non funzionare in Firefox o IE a causa dei CORS. Questo esempio risolve il problema.
<IfModule mod_headers.c>
<FilesMatch "\.(eot|otf|ttc|ttf|woff|woff2)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
Il contenuto del tuo testo de evessere sempre codificato UTF-8 no?
# Utilizza la codifica UTF-8 per qualasiasi contenuto inviato come text/plain or text/html
AddDefaultCharset utf-8
# Forza UTF-8 per un numero di formati file
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
Se vi trovate in un hosting condiviso è possibile che sia presente più di una versione di PHP e a volte potreste aver bisogno di una versione specifica per il vostro sito web. Es. Laravel richiede PHP >= 5.4. il seguente esempio switch the PHP version for you.
AddHandler application/x-httpd-php55 .php
# Alternatively, you can use AddType
AddType application/x-httpd-php55 .php
La Visualizzazione Compatibilità in internet exporer potrebbe creare problemi nel come vengano visualizzati alcuni siti web. Il seguente esempio dovrebbe forzare IE ad utilizzare il motore di Rendering Edge e disabilitare la Visualizzazione Compatibilità.
<IfModule mod_headers.c>
BrowserMatch MSIE is-msie
Header set X-UA-Compatible IE=edge env=is-msie
</IfModule>
Se sono supportate le immagini WebP inviate un’immagine webp in caso sia stata richiesta un’immagine jpg/png con lo stesso nome e nello stesso percorso.
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule (.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]