Nel panorama dei server web, Apache si distingue per la sua modularità e flessibilità. Una delle sue caratteristiche più distintive è la capacità di gestire configurazioni a livello di directory attraverso il file .htaccess
.
Il file .htaccess
ha una vasta gamma di utilizzi, grazie alla sua capacità di personalizzare la configurazione del server a livello di directory.
Contenuto
- 1 Esempi di reindirizzamento URL con .htaccess
- 1.1 Reindirizzare da HTTP a HTTPS
- 1.2 Reindirizzare da un dominio non-www a www
- 1.3 Reindirizzare vecchie pagine a nuove URL
- 1.4 Reindirizzare tutte le pagine da un vecchio dominio a un nuovo dominio:
- 1.5 Reindirizzare tutte le pagine da una vecchia directory a una nuova directory
- 1.6 Reindirizzare URL basate su una parola chiave
- 1.7 Reindirizzare tutte le pagine con una specifica estensione
- 2 Riscrittura URL con .htaccess esempi
- 3 Personalizzazione delle pagine di errore
- 4 Protezione delle directory
- 5 Ottimizzazione delle prestazioni
- 6 Sicurezza
- 7 Best practices per l’utilizzo del file .htaccess
Esempi di reindirizzamento URL con .htaccess
Negli esempi sotto, ho sempre racchiusi le operazioni della direttiva <IfModule>
.
L’uso di <IfModule>
assicura che, se il modulo non è presente o attivo, le direttive all’interno del blocco non causino errori. È una precauzione particolarmente utile quando si lavora su diversi ambienti di hosting o quando si distribuisce una configurazione a più server con differenticonfigurazioni.
Reindirizzare da HTTP a HTTPS
<IfModule mod_rewrite.c>
# Reindirizza tutte le richieste da HTTP a HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
Reindirizzare da un dominio non-www a www
<IfModule mod_rewrite.c>
# Reindirizza le richieste da non-www a www
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
Reindirizzare vecchie pagine a nuove URL
La direttiva Redirect
consente di specificare un reindirizzamento basato su una URL di origine e una di destinazione. Puoi anche specificare il codice di stato del reindirizzamento (ad es. 301 per un reindirizzamento permanente).
In questo esempio, ogni volta che un visitatore accede a vecchia-pagina.html
, verrà automaticamente reindirizzato a nuova-pagina.html
con uno status HTTP 301. Questo è particolarmente utile per la SEO, poiché informa i motori di ricerca che la vecchia pagina è stata spostata permanentemente alla nuova URL.
<IfModule mod_alias.c>
# Reindirizza una vecchia pagina a una nuova con un reindirizzamento 301
Redirect 301 /vecchia-pagina.html /nuova-pagina.html
</IfModule>
Oltre alla direttiva Redirect
è possibile utilizzare RewriteRule
e RedirectMatch
RedirectMatch
: Fa parte del modulomod_alias
di Apache ed è utile per reindirizzamenti semplici basati su pattern.RewriteRule
: Fa parte del modulomod_rewrite
di Apache ed è molto potente grazie alla sua capacità di utilizzare condizioni multiple e una varietà di flag.
# Utilizzo RedirectMatch
<IfModule mod_alias.c>
RedirectMatch 301 ^/vecchia-pagina\.html$ /nuova-pagina.html
</IfModule>
# Utilizzo RewriteRule
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^vecchia-pagina\.html$ /nuova-pagina.html [R=301,L]
</IfModule>
Reindirizzare tutte le pagine da un vecchio dominio a un nuovo dominio:
Questo è utile se hai cambiato il nome del tuo dominio e vuoi reindirizzare tutto il traffico dal vecchio al nuovo dominio.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^vecchiodominio\.com [NC]
RewriteRule ^(.*)$ http://nuovodominio.com/$1 [R=301,L]
</IfModule>
Reindirizzare tutte le pagine da una vecchia directory a una nuova directory
Se hai rinominato o spostato una directory e vuoi reindirizzare tutto il traffico dalla vecchia alla nuova directory.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^vecchia-directory/(.*)$ /nuova-directory/$1 [R=301,L]
</IfModule>
oppure
<IfModule mod_alias.c>
RedirectMatch 301 ^/vecchia-directory/(.*)$ /nuova-directory/$1
</IfModule>
Reindirizzare URL basate su una parola chiave
Supponiamo che tu voglia reindirizzare tutte le URL che contengono la parola “vecchio” a una directory chiamata “nuovo”.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^.*vecchio.*$ /nuovo/ [R=301,L]
</IfModule>
oppure
<IfModule mod_alias.c>
RedirectMatch 301 ^/.*vecchio.*$ /nuovo/
</IfModule>
Reindirizzare tutte le pagine con una specifica estensione
Supponiamo che tu voglia reindirizzare tutte le pagine con estensione .old
a .new
<IfModule mod_alias.c>
RedirectMatch 301 ^(.*)\.old$ $1.new
</IfModule>
Riscrittura URL con .htaccess esempi
Creare URL SEO-friendly
Supponiamo di avere un e-commerce e di voler trasformare URL dinamiche come:
/prodotto.php?id=123
in /prodotto/123/
il file .htaccess dovrà contenere qualcosa di simile
<IfModule mod_rewrite.c>
RewriteEngine On
# Riscrive l'URL SEO-friendly alla sua forma dinamica
RewriteRule ^prodotto/([0-9]+)/?$ prodotto.php?id=$1 [L]
# Opzionale: reindirizza l'URL dinamica all'URL SEO-friendly
# Questo assicura che solo l'URL SEO-friendly sia visibile e utilizzato
RewriteCond %{THE_REQUEST} \s/prodotto\.php\?id=([0-9]+) [NC]
RewriteRule ^ /prodotto/%1/? [R=301,L]
</IfModule>
- La prima
RewriteRule
prende l’URL SEO-friendly e lo riscrive internamente alla sua forma dinamica. L’espressione regolare^prodotto/([0-9]+)/?$
corrisponde alle URL che iniziano con “prodotto/”, seguite da uno o più numeri, e opzionalmente terminano con una barra “/”. Il valore numerico viene catturato e utilizzato nella destinazioneprodotto.php?id=$1
. - La combinazione di
RewriteCond
eRewriteRule
successiva è opzionale ma utile. Se qualcuno accede all’URL dinamica originale, verrà reindirizzato all’URL SEO-friendly. Questo assicura coerenza e previene contenuti duplicati, che possono essere penalizzati dai motori di ricerca.
Rimozione delle estensioni dei file dalle URL (es. .php, .html)
La rimozione delle estensioni dei file dalle URL è una pratica comune per rendere le URL più pulite e user-friendly. Ecco come puoi rimuovere le estensioni dei file utilizzando mod_rewrite
in Apache.
Supponiamo che tu voglia trasformare URL come: /tua-pagina.php
a /tua-pagina
<IfModule mod_rewrite.c>
RewriteEngine On
# Riscrittura interna: da /tua-pagina a /tua-pagina.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]
# Reindirizzamento esterno: da /tua-pagina.php a /tua-pagina
RewriteCond %{THE_REQUEST} \s/+(.*?/)?(.*?)\.php[\s?/] [NC]
RewriteRule ^ /%1%2 [R=301,L]
</IfModule>
- Le condizioni
RewriteCond
verificano che:- La richiesta non corrisponda a un file esistente (
!-f
). - La richiesta non corrisponda a una directory esistente (
!-d
). - Esiste un file con l’estensione desiderata (
.php
).
- La richiesta non corrisponda a un file esistente (
- La prima
RewriteRule
in ciascun blocco gestisce la riscrittura interna, trasformando l’URL senza estensione nella sua forma con estensione. - La seconda
RewriteRule
in ciascun blocco gestisce il reindirizzamento esterno, assicurando che, se qualcuno accede all’URL con l’estensione, venga reindirizzato all’URL senza estensione. Questo previene contenuti duplicati e assicura coerenza nelle URL.
Personalizzazione delle pagine di errore
Utilizzando il file .htaccess
, puoi definire pagine personalizzate per vari codici di stato HTTP. Ecco come puoi farlo:
<IfModule mod_alias.c>
# Pagina di errore personalizzata per "404 Not Found"
ErrorDocument 404 /errore-404.html
# Pagina di errore personalizzata per "403 Forbidden"
ErrorDocument 403 /errore-403.html
# Pagina di errore personalizzata per "500 Internal Server Error"
ErrorDocument 500 /errore-500.html
# Pagina di errore personalizzata per "401 Unauthorized"
ErrorDocument 401 /errore-401.html
</IfModule>
Protezione delle directory
Limitare l’accesso a specifiche directory tramite password
Per proteggere una directory con una password, avrai bisogno di due file: .htaccess
(per la configurazione) e .htpasswd
(per gli username e le password).
.htaccess (da posizionare nella directory che desideri proteggere):
AuthType Basic
AuthName "Area protetta"
AuthUserFile /percorso-completo/.htpasswd
Require valid-user
.htpasswd (da posizionare in una directory al di fuori della root del web, per ragioni di sicurezza):
utente:password_criptata
Puoi utilizzare strumenti online (https://www.web2generators.com/apache-tools/htpasswd-generator) o comandi come htpasswd
(fornito con Apache) per generare password criptate.
Bloccare o consentire l’accesso a specifici indirizzi IP
Bloccare l’accesso da un indirizzo IP specifico:
<IfModule mod_authz_host.c>
Order allow,deny
Deny from 123.456.789.0
Allow from all
</IfModule>
Consentire l’accesso solo da un indirizzo IP specifico:
<IfModule mod_authz_host.c>
Order deny,allow
Deny from all
Allow from 123.456.789.0
</IfModule>
Se non hai un file index
.html in una directory, Apache mostrerà di default un elenco di tutti i file nella directory. Per disabilitare questa funzionalità e impedire la navigazione delle directory, puoi utilizzare il seguente codice:
<IfModule mod_autoindex.c>
Options -Indexes
</IfModule>
Con Options -Indexes
, stai dicendo ad Apache di non elencare i contenuti di una directory se non c’è un file index
.html presente.
Ottimizzazione delle prestazioni
Ottimizzare le prestazioni del tuo sito web attraverso il file .htaccess
può avere un impatto significativo sulla velocità di caricamento delle pagine e sull’esperienza complessiva dell’utente. Ecco alcune tecniche comuni che puoi implementare utilizzando il file .htaccess
:
Abilitare la compressione Gzip
La compressione Gzip riduce le dimensioni dei file inviati dal tuo server, accelerando il tempo di caricamento delle pagine.
Esempio:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>
Impostare le intestazioni di scadenza
Le intestazioni di scadenza indicano al browser quando dovrebbe considerare una risorsa come “scaduta” e richiederla nuovamente al server. Impostando queste intestazioni, puoi far sì che il browser memorizzi in cache le risorse per un periodo di tempo più lungo, riducendo le richieste al server.
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/x-javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresDefault "access plus 2 days"
</IfModule>
Sicurezza
Prevenire l’accesso diretto a file specifici
Supponiamo che tu voglia impedire l’accesso diretto a un file di configurazione chiamato wp-config.php
.
<Files wp-config.php>
Order allow,deny
Deny from all
</Files>
Con questa configurazione, chiunque tenti di accedere direttamente a wp-config.php
riceverà un errore “403 Forbidden”.
Implementare misure anti-hotlinking per le immagini
L’hotlinking si verifica quando un altro sito web utilizza un link diretto alle tue immagini, consumando la tua larghezza di banda. Puoi prevenire l’hotlinking con il seguente codice:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?tuodominio.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
</IfModule>
- La prima
RewriteCond
verifica se l’intestazioneReferer
è presente (non vuota). - La seconda
RewriteCond
verifica se l’intestazioneReferer
non corrisponde al tuo dominio. - La
RewriteRule
blocca l’accesso alle immagini (formati jpg, jpeg, png, gif) se le condizioni precedenti sono vere, restituendo un errore “403 Forbidden”.
Best practices per l’utilizzo del file .htaccess
Il file .htaccess
è uno strumento potente. Un errore in questo file può causare malfunzionamenti del sito o addirittura renderlo completamente inaccessibile. Ecco alcune best practices da seguire quando si lavora con il file .htaccess
:
Backup Prima di Ogni Modifica
Prima di apportare qualsiasi modifica al file .htaccess
, è essenziale effettuare un backup della versione attuale. Questo passo garantisce che, in caso di errori o problemi, sia possibile ripristinare rapidamente la configurazione precedente e ridurre i tempi di inattività del sito.
Testare Dopo Ogni Modifica
Dopo aver apportato modifiche al file .htaccess
, è fondamentale testare il sito in modo approfondito. Questo include la verifica delle nuove regole implementate, ma anche la navigazione generale del sito per assicurarsi che non siano stati introdotti problemi inaspettati.
Mantenere il File Organizzato e Commentato
Con il tempo, il file .htaccess
può diventare piuttosto complesso, specialmente se contiene molte regole e direttive. Per facilitare la manutenzione e la comprensione del file, è consigliabile organizzare le direttive in sezioni logiche. Per commentare nel file .htaccess
, si utilizza il carattere #
all’inizio di una riga. Ogni riga che inizia con #
sarà considerata un commento e non verrà eseguita dal server. Ad esempio:
# Questo è un commento e non verrà interpretato da Apache
RewriteEngine On # Attiva il modulo di riscrittura delle URL
Utilizzare commenti per descrivere lo scopo di ogni blocco di codice non solo aiuta te stesso in futuro, ma anche altri sviluppatori o amministratori che potrebbero dover lavorare sul file.
Limitare l’uso dove possibile
Anche se il file .htaccess
è potente, l’uso eccessivo può influire sulle prestazioni del server, poiché le direttive in esso contenute vengono valutate ad ogni richiesta. Se possibile, considera l’idea di spostare alcune configurazioni nel file di configurazione principale di Apache (httpd.conf
o simili) per migliorare le prestazioni.
Lascia un commento