Comment bloquer une IP avec .htaccess ?
Le fichier .htaccess est l'un des outils les plus puissants à disposition des administrateurs de sites web sur serveurs Apache. Il permet de contrôler finement l'accès à votre site sans toucher à la configuration principale du serveur. Parmi ses usages les plus courants : bloquer des adresses IP indésirables — robots malveillants, scrapers, attaquants, ou simplement des visiteurs dont vous ne souhaitez pas l'accès. Voici toutes les méthodes disponibles, de la plus simple à la plus avancée.
Prérequis : activer mod_authz_host
Les directives de contrôle d'accès par IP dans .htaccess nécessitent que le module Apache mod_authz_host soit activé sur votre serveur. C'est le cas par défaut sur la quasi-totalité des hébergements mutualisés et des serveurs Apache modernes. Si vous gérez votre propre serveur, vérifiez avec :
apache2ctl -M | grep authzNotez également que la syntaxe diffère légèrement entre Apache 2.2 et Apache 2.4 (la version actuelle). Les deux syntaxes sont présentées ci-dessous.
Bloquer une IP unique
C'est le cas le plus simple. Ajoutez ces lignes dans votre fichier .htaccess à la racine de votre site :
Apache 2.4 (syntaxe actuelle) :
<RequireAll>
Require all granted
Require not ip 123.456.789.0
</RequireAll>Apache 2.2 (ancienne syntaxe) :
Order Allow,Deny
Allow from all
Deny from 123.456.789.0Remplacez 123.456.789.0 par l'adresse IP que vous souhaitez bloquer. Le visiteur recevra une erreur 403 Forbidden.
Bloquer plusieurs IPs simultanément
Vous pouvez ajouter autant d'adresses que nécessaire en les listant sur la même ligne ou sur des lignes séparées :
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.44Bloquer une plage d'IPs (subnet)
Si vous devez bloquer un bloc entier d'adresses — par exemple toutes les IPs d'un fournisseur d'accès ou d'un datacenter — vous pouvez utiliser la notation CIDR ou le préfixe de sous-réseau :
Par préfixe (toutes les IPs commençant par 123.456.789) :
<RequireAll>
Require all granted
Require not ip 123.456.789
</RequireAll>Par notation CIDR (bloc /24, soit 256 adresses) :
<RequireAll>
Require all granted
Require not ip 123.456.789.0/24
</RequireAll>Autres exemples de masques courants :
- /32 — une seule IP
- /24 — 256 adresses (ex : 123.456.789.0 à 123.456.789.255)
- /16 — 65 536 adresses (ex : 123.456.0.0 à 123.456.255.255)
- /8 — 16 millions d'adresses (ex : 123.0.0.0 à 123.255.255.255)
Bloquer une IP sur un répertoire spécifique
Si vous souhaitez bloquer l'accès d'une IP uniquement à un sous-répertoire de votre site (par exemple votre espace d'administration), placez un fichier .htaccess dans ce répertoire spécifique avec la règle de blocage :
<RequireAll>
Require all granted
Require not ip 123.456.789.0
</RequireAll>Bon à savoir : vous pouvez également utiliser les blocs <Directory>, <Files> ou <Location> directement dans le fichier httpd.conf ou apache2.conf pour un contrôle encore plus précis — par exemple bloquer une IP sur un fichier spécifique uniquement. Cette approche est plus performante que le .htaccess car elle ne nécessite pas qu'Apache lise le fichier à chaque requête.
Autoriser uniquement certaines IPs (liste blanche)
L'opération inverse est également possible : n'autoriser l'accès qu'à une ou plusieurs IPs spécifiques et bloquer tout le reste. C'est particulièrement utile pour protéger une interface d'administration :
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.32Toute IP non listée recevra une erreur 403. Notez que si votre IP est dynamique (elle change à chaque connexion), cette approche peut vous bloquer vous-même — préférez alors une liste blanche par plage de sous-réseau.
Rediriger une IP bloquée plutôt que renvoyer une 403
Au lieu d'afficher une erreur 403 brute, vous pouvez rediriger les IPs bloquées vers une autre page — une page d'erreur personnalisée ou même une autre URL :
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^123.456.789.0$
RewriteRule ^ /acces-interdit.html [R=302,L]Notez l'échappement des points avec . dans la condition RewriteCond — les points ont une signification spéciale en expressions régulières (ils correspondent à n'importe quel caractère), il faut donc les échapper pour qu'ils correspondent uniquement à un point littéral.
Bloquer un User-Agent plutôt qu'une IP
Certains robots malveillants ou scrapers changent d'IP régulièrement mais conservent le même User-Agent. Dans ce cas, bloquer par User-Agent est plus efficace :
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^(BadBot|EvilScraper|MaliciousSpider) [NC]
RewriteRule .* - [F,L]Le flag [F] renvoie une erreur 403, [NC] rend la comparaison insensible à la casse. Vous pouvez ajouter autant de User-Agents que nécessaire en les séparant par des |.
| Cas d'usage | Méthode recommandée | Syntaxe clé |
|---|---|---|
| Bloquer une IP unique | Require not ip | Require not ip 1.2.3.4 |
| Bloquer plusieurs IPs | Require not ip (multiple) | Require not ip 1.2.3.4 (répété) |
| Bloquer une plage /24 | Notation CIDR | Require not ip 1.2.3.0/24 |
| Autoriser uniquement certaines IPs | Liste blanche | Require ip 1.2.3.4 |
| Rediriger au lieu de bloquer | RewriteRule | RewriteCond %{REMOTE_ADDR} |
| Bloquer par User-Agent | RewriteRule + HTTP_USER_AGENT | RewriteCond %{HTTP_USER_AGENT} |
Bon à savoir : les modifications apportées au fichier .htaccess sont prises en compte immédiatement par Apache, sans redémarrage du serveur nécessaire. En revanche, un fichier .htaccess mal formé peut rendre votre site entièrement inaccessible avec une erreur 500. Testez toujours vos modifications sur un environnement de développement ou sauvegardez le fichier original avant toute modification en production. Si votre site tombe en erreur 500 après modification, rechargez immédiatement l'ancienne version du fichier.
Nicolas,