Come bloccare un IP con .htaccess?
Il file .htaccess è uno degli strumenti più potenti a disposizione degli amministratori di siti web su server Apache. Consente di controllare con precisione l'accesso al tuo sito senza toccare la configurazione principale del server. Tra i suoi usi più comuni: bloccare indirizzi IP indesiderati — bot malevoli, scraper, attaccanti, o semplicemente visitatori di cui non vuoi l'accesso. Ecco tutti i metodi disponibili, dal più semplice al più avanzato.
Prerequisiti: abilitare mod_authz_host
Le direttive di controllo accesso per IP in .htaccess richiedono che il modulo Apache mod_authz_host sia abilitato sul tuo server. Questo è il caso predefinito su quasi tutti gli hosting condivisi e i server Apache moderni. Se gestisci il tuo server, verifica con:
apache2ctl -M | grep authzNota anche che la sintassi differisce leggermente tra Apache 2.2 e Apache 2.4 (la versione attuale). Entrambe le sintassi sono presentate di seguito.
Bloccare un IP singolo
È il caso più semplice. Aggiungi queste righe nel tuo file .htaccess alla radice del tuo sito:
Apache 2.4 (sintassi attuale):
<RequireAll>
Require all granted
Require not ip 123.456.789.0
</RequireAll>Apache 2.2 (vecchia sintassi):
Order Allow,Deny
Allow from all
Deny from 123.456.789.0Sostituisci 123.456.789.0 con l'indirizzo IP che vuoi bloccare. Il visitatore riceverà un errore 403 Forbidden.
Bloccare più IP contemporaneamente
Puoi aggiungere tanti indirizzi quanti ne hai bisogno, elencandoli sulla stessa riga o su righe separate:
Apache 2.4:
<RequireAll>
Require all granted
Require not ip 123.456.789.0
Require not ip 98.76.54.32
Require not ip 11.22.33.44
</RequireAll>Apache 2.2:
Order Allow,Deny
Allow from all
Deny from 123.456.789.0 98.76.54.32 11.22.33.44Bloccare un range di IP (subnet)
Se devi bloccare un intero blocco di indirizzi — ad esempio tutti gli IP di un provider o di un datacenter — puoi usare la notazione CIDR o il prefisso di sottorete:
Per prefisso (tutti gli IP che iniziano con 123.456.789):
<RequireAll>
Require all granted
Require not ip 123.456.789
</RequireAll>Per notazione CIDR (blocco /24, ovvero 256 indirizzi):
<RequireAll>
Require all granted
Require not ip 123.456.789.0/24
</RequireAll>Altri esempi di maschere comuni:
- /32 — un singolo IP
- /24 — 256 indirizzi (es.: da 123.456.789.0 a 123.456.789.255)
- /16 — 65.536 indirizzi (es.: da 123.456.0.0 a 123.456.255.255)
- /8 — 16 milioni di indirizzi (es.: da 123.0.0.0 a 123.255.255.255)
Bloccare un IP su una directory specifica
Se vuoi bloccare l'accesso di un IP solo a una sottodirectory del tuo sito (ad esempio la tua area di amministrazione), inserisci un file .htaccess in quella directory specifica con la regola di blocco:
<RequireAll>
Require all granted
Require not ip 123.456.789.0
</RequireAll>Lo sapevi? puoi anche usare i blocchi <Directory>, <Files> o <Location> direttamente nel file httpd.conf o apache2.conf per un controllo ancora più preciso — ad esempio bloccare un IP solo su un file specifico. Questo approccio è più performante del .htaccess perché non richiede che Apache legga il file a ogni richiesta.
Lista bianca: autorizzare solo certi IP
L'operazione inversa è anch'essa possibile: autorizzare l'accesso solo a uno o più IP specifici e bloccare tutto il resto. È particolarmente utile per proteggere un'interfaccia di amministrazione:
Apache 2.4:
Require ip 123.456.789.0
Require ip 98.76.54.32Apache 2.2:
Order Deny,Allow
Deny from all
Allow from 123.456.789.0
Allow from 98.76.54.32Qualsiasi IP non elencato riceverà un errore 403. Nota che se il tuo IP è dinamico (cambia a ogni connessione), questo approccio potrebbe bloccare anche te — in tal caso preferisci una lista bianca per range di sottorete.
Reindirizzare un IP bloccato invece di restituire un 403
Invece di mostrare un errore 403 grezzo, puoi reindirizzare gli IP bloccati verso un'altra pagina — una pagina di errore personalizzata o anche un'altra URL:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^123.456.789.0$
RewriteRule ^ /accesso-negato.html [R=302,L]Nota l'escape dei punti con . nella condizione RewriteCond — i punti hanno un significato speciale nelle espressioni regolari (corrispondono a qualsiasi carattere), quindi devono essere escapati per corrispondere solo a un punto letterale.
Bloccare per User-Agent invece che per IP
Alcuni bot malevoli o scraper cambiano IP regolarmente ma mantengono lo stesso User-Agent. In questo caso, bloccare per User-Agent è più efficace:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^(BadBot|EvilScraper|MaliciousSpider) [NC]
RewriteRule .* - [F,L]Il flag [F] restituisce un errore 403, [NC] rende il confronto insensibile alle maiuscole. Puoi aggiungere tanti User-Agent quanti ne hai bisogno separandoli con |.
| Caso d'uso | Metodo consigliato | Sintassi chiave |
|---|---|---|
| Bloccare un IP singolo | Require not ip | Require not ip 1.2.3.4 |
| Bloccare più IP | Require not ip (multiplo) | Require not ip 1.2.3.4 (ripetuto) |
| Bloccare un range /24 | Notazione CIDR | Require not ip 1.2.3.0/24 |
| Lista bianca di IP specifici | Lista bianca | Require ip 1.2.3.4 |
| Reindirizzare invece di bloccare | RewriteRule | RewriteCond %{REMOTE_ADDR} |
| Bloccare per User-Agent | RewriteRule + HTTP_USER_AGENT | RewriteCond %{HTTP_USER_AGENT} |
Lo sapevi? le modifiche apportate al file .htaccess entrano in vigore immediatamente in Apache, senza necessità di riavviare il server. Tuttavia, un file .htaccess malformato può rendere il tuo sito completamente inaccessibile con un errore 500. Testa sempre le modifiche in un ambiente di sviluppo o salva il file originale prima di qualsiasi modifica in produzione. Se il tuo sito restituisce un errore 500 dopo la modifica, ripristina immediatamente la versione precedente del file.
Nicolas,