wp-note

Sviluppo Siti Web

Che cos’è il file .htaccess e a cosa serve? Esempi pratici

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.

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 modulo mod_alias di Apache ed è utile per reindirizzamenti semplici basati su pattern.
  • RewriteRule: Fa parte del modulo mod_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>
  1. 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 destinazione prodotto.php?id=$1.
  2. La combinazione di RewriteCond e RewriteRule 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 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>

Disabilitare la navigazione delle directory

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’intestazione Referer è presente (non vuota).
  • La seconda RewriteCond verifica se l’intestazione Referer 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.


Pubblicato

in

,

da

Tag:

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *