21 KiB
.htaccess Snippets
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.
Riconoscimenti
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.
Sommario
- Rewrite e Redirection
- Forza www
- Forza www in maniera generica
- Forza non-www
- Forza non-www in maniera generica
- Forza HTTPS
- Forza HTTPS se dietro Proxy
- Forza lo Slash finale
- Rimuovi lo Slash finale
- Rimuovi lo Slash finale da percorsi arbitrari
- Redireziona una singola pagina
- Alias a singole Cartelle
- Percorsi Alias a Script
- Redireziona un Intero Sito
- Alias per URL "Pulite"
- Sicurezza
- Nega tutti gli accessi
- Nega l'accesso a tutti tranne per te stesso
- Permetti a tutti l'accesso tranne agli Spammer
- Nega l'accesso a Cartelle e File Nascosti
- Nega l'accesso a Backup e File Sorgenti
- Disabilita l'Esplorazione delle Cartelle
- Disabilita Hotlinking delle Immagini
- Disabilita Hotlinking delle Immagini per Domini Specifici
- Proteggi una Cartella con Password
- Proteggi uno o più file con Password
- Blocca i visitatori in base al Referrer
- Previeni l'inclusione del Sito tramite frame (framing)
- Prestazioni
- Miscellanea
- Imposta variabili PHP
- Pagine di Errore Personalizzate
- Forza il Download
- Previeni il Download
- Permetti i Web Font da domini differenti
- Codifica automaticamente in UTF-8
- Passa a una versione diversa di PHP
- Disabilita Visualizzazione Compatibilità di Internet Explorer
- Rendere disponibili immagini in formato WebP
Rewrite e Redirection
Nota: Si presume che mod_rewrite
sia installato e abilitato.
Forza www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^esempio\.com [NC]
RewriteRule ^(.*)$ http://www.esempio.com/$1 [L,R=301,NC]
Forza www in maniera generica
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
Forza non-www
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]
Forza non-www in maniera generica
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]
Forza HTTPS
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>
Forza HTTPS se dietro Proxy
Utile se hai un proxy con TLS prima del tuo server.
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Forza Slash Finale
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
Rimuovi Slash Finale
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
Rimuovi Slash Finale da percorsi arbitrari
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]
Redireziona una singola pagina
Redirect 301 /vecchiapagina.html http://www.esempio.com/nuovapagina.html
Redirect 301 /vecchiapagina2.html http://www.esempio.com/cartella/
Alias di una singola Cartella
RewriteEngine On
RewriteRule ^source-directory/(.*) /target-directory/$1 [R=301,L]
Percorsi Alias a Script
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.
Redireziona un intero sito
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
Alias per URL "Pulite"
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]
Sicurezza
Nega tutti gli Accessi
## 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...
Nega l'accesso a tutti tranne per te stesso
## 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:
Permetti a tutti gli accessi tranne agli Spammer
## 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
Nega l'accesso a Cartelle e File Nascosti
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 /\..*$
Nega l'accesso a Backup e File Sorgenti
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>
Disabilita Esplorazione Cartella
Options All -Indexes
Disabilita Hotlinking delle Immagini
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]
Disabilita Hotlinking delle Immagini per Domini Specifici
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]
Proteggi una Cartella con Password
Prima è necessario creare un file .htpasswd
da qualche parte nell sistema:
htpasswd -c /home/compagnia/.htpasswd boromir
E adesso potete utilizzarlo per l'autenticazione:
AuthType Basic
AuthName "Non si entra con facilità"
AuthUserFile /home/compagnia/.htpasswd
Require valid-user
Proteggi uno o più file con Password
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>
Blocca i visitatori in base al Referrer
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]
Previeni l'inclusione del Sito tramite frame (framing)
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
Prestazioni
Comprimi i File di Testo
<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>
Imposta gli Header "Expires"
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>
Disabilita eTags
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
Miscellanea
Set PHP Variables
php_value <key> <val>
# Peresempio:
php_value upload_max_filesize 50M
php_value max_execution_time 240
Pagine Personalizzate di Errore
ErrorDocument 500 "Houston, abbiamo un problema."
ErrorDocument 401 http://errore.esempio.com/mordor.html
ErrorDocument 404 /errori/halflife3.html
Forza Download
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:
Previeni il Download
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>
Permetti i Web Font da domini differenti
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>
Codifica automaticamente in UTF-8
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
Passa a un'altra versione di PHP Version
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
Disabilita Visualizzazione Compatibilità di Internet Explorer
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>
Rendere disponibili immagini in formato WebP
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]