Chaque jour, des milliers de sites WordPress sont compromis sans être directement ciblés. La plupart du temps, les attaques sont automatisées et exploitent des failles simples de configuration. Le fichier .htaccess permet de bloquer ces menaces avant qu’elles n’atteignent le système de gestion de contenu. Pour une protection immédiate, voici 15 règles htaccess WordPress prêtes à copier.
Un site WordPress piraté. Voilà une phrase qui fait froid dans le dos à quiconque possède un site web. Et pourtant, la majorité de ces piratages auraient pu être évités avec des mesures simples, appliquées avant l’attaque. La protection du site n’est pas une course d’armement réservée aux grandes entreprises. Un petit site vitrine, un blog personnel ou une boutique WooCommerce sont tout autant dans le viseur des robots malveillants. Pourquoi ? Parce que les attaquants ne ciblent pas votre notoriété. Ils ciblent vos failles. Et un petit site mal entretenu est une cible bien plus facile qu’un grand site protégé par une équipe dédiée.
Si vous n’avez pas encore appliqué les mesures de base, commencez par lire notre Guide Complet de Sécurité WordPress avant de plonger dans les règles .htaccess.
Dans ce guide, vous allez découvrir 15 règles concrètes et testées pour renforcer le durcissement WordPress grâce au fichier .htaccess.
Ce que vous allez apprendre
- Bloquer les attaques automatiques qui ciblent WordPress
- Protéger les fichiers sensibles de votre installation
- Renforcer la sécurisation serveur sans ajouter de plugin
- Appliquer des règles htaccess WordPress testées et prêtes à copier
htaccess WordPress : pourquoi ce fichier est indispensable
Le fichier .htaccess est un fichier de configuration utilisé par les serveurs Apache. Dans WordPress, il gère principalement les permaliens, mais il peut aussi servir de rempart contre les intrusions. Comme il est lu avant le chargement de WordPress, il représente une couche de protection applicative extrêmement efficace. Un site non protégé peut être scanné et attaqué en quelques secondes ; un .htaccess bien configuré stoppe ces tentatives avant qu’elles n’atteignent le système. Pour en savoir plus sur le fonctionnement des fichiers de configuration, consultez la documentation officielle Apache.
Toutes les règles que nous allons ajouter se placeront avant la ligne # BEGIN WordPress dans le fichier. Avant toute manipulation, téléchargez une copie de sauvegarde, testez chaque bloc un par un et gardez un accès FTP actif pour pouvoir revenir en arrière en cas d’erreur.
1. Protéger le fichier .htaccess lui-même
La première règle de sécurité web consiste à empêcher la lecture du fichier .htaccess depuis l’extérieur. Si un attaquant peut le consulter, il découvre toutes vos défenses.
# Protection du fichier .htaccess
<Files .htaccess>
Require all denied
</Files>
2. Protéger le fichier wp-config.php
Le fichier wp-config.php contient les identifiants de votre base de données. Le rendre inaccessible est une priorité absolue pour la protection du backend.
# Protection de wp-config.php
<Files wp-config.php>
Require all denied
</Files>
3. Désactiver l’affichage du contenu des répertoires
Quand un dossier ne contient pas de page index, le serveur peut afficher la liste de tous les fichiers présents. Cette règle de sécurité site web empêche les curieux de voir ce que contiennent vos répertoires.
# Désactiver l'affichage des répertoires
Options -Indexes
4. Bloquer XML-RPC avec htaccess WordPress
Le fichier xmlrpc.php est massivement exploité pour des attaques par force brute WordPress. Si vous n’utilisez pas l’application mobile WordPress, bloquez-le totalement.
# Blocage complet de xmlrpc.php
<Files xmlrpc.php>
Require all denied
</Files>
Si vous avez besoin de xmlrpc.php, restreignez son accès à votre adresse IP. Pour une protection encore plus robuste, combinez ces règles avec un firewall WordPress.
# Limitation de xmlrpc.php à une IP
<Files xmlrpc.php>
Require ip 123.123.123.123
</Files>
5. Protéger les fichiers sensibles de WordPress
Plusieurs fichiers WordPress ne devraient jamais être accessibles publiquement. Cette règle leur applique une interdiction stricte et renforce la sécurisation du site.
# Protection des fichiers sensibles WordPress
<FilesMatch "^(wp-config\.php|php\.ini|php5\.ini|\.htaccess|readme\.html|license\.txt|changelog\.txt|debug\.log)$">
Require all denied
</FilesMatch>
6. Désactiver l’exécution de code dans les dossiers d’upload
Le dossier uploads ne doit contenir que des médias. Cette règle empêche l’exécution de scripts PHP qui auraient pu être déposés par un pirate.
# Désactiver l'exécution de code dans les dossiers d'upload
<Directory "/wp-content/uploads">
<FilesMatch "\.(php|php\.|php5|php7|phtml|phar|pl|py|jsp|asp|sh|cgi)$">
Require all denied
</FilesMatch>
Options -ExecCGI
<IfModule mod_headers.c>
Header set X-Content-Type-Options "nosniff"
</IfModule>
</Directory>
7. Bloquer les injections malveillantes via l’URL
Les attaquants utilisent des caractères spécifiques dans les URLs pour tenter des injections SQL. Ces requêtes n’ont rien à faire sur un site légitime, et cette règle les rejette avec une erreur 403.
# Bloquer les caractères suspects dans les URLs
RewriteCond %{QUERY_STRING} (\<|%3C)([^s]*s)+cript.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C)([^i]*i)+mg.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C)([^i]*i)+frame.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
RewriteCond %{QUERY_STRING} union([\s]+)?select [NC,OR]
RewriteCond %{QUERY_STRING} \\\[.*\\\] [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C)([^e]*e)+mbed.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C)([^o]*o)+bject.*(\>|%3E) [NC]
RewriteRule .* - [F,L]
8. Bloquer l’accès aux fichiers cachés
Les fichiers commençant par un point (.git, .env, .htpasswd) contiennent des informations sensibles. Cette règle les protège intégralement.
# Bloquer l'accès aux fichiers et dossiers cachés
RewriteRule (^\.|/\.) - [F,L]
9. Protéger le dossier wp-includes
Le cœur de WordPress réside dans wp-includes. Ces fichiers ne sont pas destinés à être appelés directement, et cette règle verrouille leur accès.
# Bloquer l'accès direct à wp-includes
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
10. Activer les en-têtes de sécurité HTTP
Si le module mod_headers est actif sur votre serveur Apache, vous pouvez ajouter des en-têtes qui renforcent la protection site web côté navigateur.
# En-têtes de sécurité
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=()"
</IfModule>
11. Limiter l’accès à la page de connexion
Si vous administrez votre site depuis une adresse IP fixe, restreignez l’accès à wp-login.php. Cette règle bloque presque toutes les attaques par brute force.
# Restreindre l'accès à wp-login.php par IP
<Files wp-login.php>
Require ip 123.123.123.123
Require ip 456.456.456.456
</Files>
12. Bloquer les requêtes sans User-Agent
Les navigateurs légitimes envoient toujours un User-Agent. Les robots malveillants l’oublient souvent. Cette règle les arrête net.
# Bloquer les requêtes sans User-Agent
RewriteCond %{HTTP_USER_AGENT} ^-?$
RewriteRule ^ - [F,L]
13. Bloquer les User-Agents malveillants connus
Des outils de scan comme sqlmap, nessus ou wpscan sont utilisés par les attaquants. Ce bloc les rejette directement, renforçant votre firewall WordPress.
# Bloquer les User-Agents malveillants
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} (havij|libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader|fetch|extract|grab|miner|collector|screenshot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (acunetix|nmap|sqlmap|nessus|openvas|wpscan|metasploit|hydra|dirbuster|nikto) [NC]
RewriteRule .* - [F,L]
14. Limiter la taille des requêtes POST
Les attaques par force brute ou DDoS envoient souvent des requêtes POST massives. Cette règle plafonne la taille autorisée.
# Limiter la taille des uploads et des requêtes POST
LimitRequestBody 10485760
15. Fichier htaccess WordPress complet prêt à copier
Voici l’intégralité des règles rassemblées. Testez bloc par bloc.
# ============================================
# PROTECTION DU FICHIER .HTACCESS
# ============================================
<Files .htaccess>
Require all denied
</Files>
# ============================================
# PROTECTION DE WP-CONFIG.PHP
# ============================================
<Files wp-config.php>
Require all denied
</Files>
# ============================================
# PROTECTION DES FICHIERS SENSIBLES
# ============================================
<FilesMatch "^(wp-config\.php|php\.ini|php5\.ini|\.htaccess|readme\.html|license\.txt|changelog\.txt|debug\.log)$">
Require all denied
</FilesMatch>
# ============================================
# DÉSACTIVER L'AFFICHAGE DES RÉPERTOIRES
# ============================================
Options -Indexes
# ============================================
# BLOCAGE DE XMLRPC.PHP
# ============================================
<Files xmlrpc.php>
Require all denied
</Files>
# ============================================
# EN-TÊTES DE SÉCURITÉ
# ============================================
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=()"
</IfModule>
# ============================================
# BLOCAGE DES CARACTÈRES SUSPECTS DANS LES URLS
# ============================================
RewriteCond %{QUERY_STRING} (\<|%3C)([^s]*s)+cript.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C)([^i]*i)+mg.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C)([^i]*i)+frame.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
RewriteCond %{QUERY_STRING} union([\s]+)?select [NC,OR]
RewriteCond %{QUERY_STRING} \\\[.*\\\] [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C)([^e]*e)+mbed.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C)([^o]*o)+bject.*(\>|%3E) [NC]
RewriteRule .* - [F,L]
# ============================================
# BLOCAGE DES USER-AGENTS MALVEILLANTS
# ============================================
RewriteCond %{HTTP_USER_AGENT} ^-?$ [OR]
RewriteCond %{HTTP_USER_AGENT} (havij|libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader|fetch|extract|grab|miner|collector|screenshot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (acunetix|nmap|sqlmap|nessus|openvas|wpscan|metasploit|hydra|dirbuster|nikto) [NC]
RewriteRule .* - [F,L]
# ============================================
# BLOCAGE DE L'ACCÈS AUX FICHIERS CACHÉS
# ============================================
RewriteRule (^\.|/\.) - [F,L]
# ============================================
# PROTECTION DE WP-INCLUDES
# ============================================
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
# ============================================
# LIMITATION DE LA TAILLE DES REQUÊTES
# ============================================
LimitRequestBody 10485760
# ============================================
# WORDPRESS - RÈGLES PAR DÉFAUT
# ============================================
# BEGIN WordPress
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
⚠️ Erreurs fréquentes avec .htaccess
Même avec les meilleures intentions, une erreur de syntaxe peut rendre votre site inaccessible. Voici les pièges les plus courants à éviter.
- Oublier de sauvegarder le fichier original. Sans copie de secours, vous n’avez aucun filet de sécurité en cas de problème. Gardez toujours une version fonctionnelle de côté.
- Copier toutes les règles d’un coup sans test. Si le site tombe en erreur 500, vous ne saurez pas quelle ligne est responsable. Ajoutez les blocs un par un et vérifiez le site entre chaque ajout.
- Mélanger des directives Apache et Nginx. Le fichier .htaccess ne fonctionne que sur les serveurs Apache. Si votre hébergeur utilise Nginx, ces règles doivent être converties dans le fichier de configuration du serveur.
- Placer les règles après le bloc WordPress. Les directives de sécurité doivent impérativement être placées avant
# BEGIN WordPress. Sinon, elles risquent d’être ignorées ou écrasées lors d’une mise à jour des permaliens. - Utiliser des chemins absolus incorrects. Certaines règles nécessitent un chemin exact. Vérifiez toujours que le chemin correspond à la structure réelle de votre hébergement.
- Confondre majuscules et minuscules. Les noms de fichiers WordPress sont sensibles à la casse. Écrire
Wp-Config.phpau lieu dewp-config.phprendra la règle inefficace.
📌 Résumé des protections essentielles
| Protection | Menace bloquée | Règle associée |
|---|---|---|
| Protection wp-config.php | Vol d’identifiants base de données | Règle 2 |
| Blocage XML-RPC | Attaques par force brute | Règle 4 |
| Restriction accès fichiers | Lecture de fichiers sensibles | Règles 5 et 8 |
| Headers sécurité | Clickjacking, MIME sniffing, XSS | Règle 10 |
| Filtrage requêtes suspectes | Injections SQL, scripts malveillants | Règle 7 |
| Limitation taille requêtes | Attaques DDoS, brute force massive | Règle 14 |
Conclusion : le .htaccess, votre meilleur rempart
Le fichier .htaccess est l’une des protections les plus fiables pour sécuriser un site WordPress. Bien configuré, il bloque une grande partie des attaques automatiques sans ralentir votre site ni dépendre d’un plugin qu’il faudra maintenir à jour.
Ces règles sont votre première ligne de défense. Pour compléter cette protection applicative avec des mesures comme le pare-feu, la double authentification et les sauvegardes, découvrez notre Guide Complet de Sécurité WordPress. Chaque règle ajoutée est une serrure supplémentaire sur votre porte d’entrée.
❓ Questions fréquentes sur le fichier .htaccess et WordPress
Est-ce que ces règles fonctionnent sur tous les hébergeurs ?
Oui, elles sont conçues pour les serveurs Apache avec le module mod_rewrite activé. Si votre site est hébergé chez un hébergeur classique (o2switch, Infomaniak, LWS, Hostinger, PlanetHoster), elles fonctionneront sans problème. Si vous êtes sur un serveur Nginx, le fichier .htaccess n’est pas utilisé et ces règles doivent être traduites dans la configuration Nginx.
Puis-je tout copier-coller d'un coup dans mon .htaccess ?
Techniquement oui, mais je vous le déconseille fortement. Testez bloc par bloc, en commençant par les règles les plus simples. Si votre site devient inaccessible, vous saurez immédiatement quel bloc pose problème.
Où se trouve le fichier .htaccess de mon site WordPress ?
Il se trouve à la racine de votre installation WordPress, dans le même dossier que les fichiers wp-config.php, wp-admin, wp-content. Connectez-vous à votre espace FTP ou au gestionnaire de fichiers de votre hébergeur, ouvrez le dossier public_html, et vous le trouverez. S’il n’apparaît pas, activez l’affichage des fichiers cachés.
Ces règles peuvent-elles ralentir mon site ?
Non. Contrairement aux plugins de sécurité qui s’exécutent dans WordPress, les règles .htaccess sont exécutées par le serveur web lui-même. Leur impact sur la vitesse est négligeable. C’est l’une des raisons pour lesquelles la protection serveur par .htaccess est si efficace.
Que faire si mon site affiche une erreur 500 après modification ?
Ne paniquez pas. Connectez-vous en FTP, renommez le fichier .htaccess en .htaccess_backup, et votre site redeviendra immédiatement accessible. Ensuite, identifiez le bloc qui pose problème, corrigez-le ou supprimez-le, et remettez le fichier en place.


