.htaccess Snippets Awesome

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

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]

Sorgente

Redireziona una singola pagina

Redirect 301 /vecchiapagina.html http://www.esempio.com/nuovapagina.html
Redirect 301 /vecchiapagina2.html http://www.esempio.com/cartella/

Sorgente

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]

Sorgente

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>

Sorgente

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>

Sorgente

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>

Sorgente

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

Sorgente

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]

Sorgente