.htaccess WordPress : optimisations performances et cache navigateur
Optimisez votre .htaccess WordPress : compression Gzip, cache navigateur, sécurité, redirections 301 et configuration spécifique OVH/o2switch.
Introduction : le rôle du .htaccess pour Apache et WordPress
Le fichier .htaccess est un fichier de configuration local pour le serveur web Apache. Il permet de définir des règles qui s’appliquent à un répertoire et tous ses sous-répertoires, sans toucher à la configuration principale d’Apache. Pour WordPress, ce fichier est crucial : il gère les permaliens, les redirections, la compression, le cache navigateur et la sécurité. En 2026, la majorité des hébergements mutualisés français (OVH, o2switch, Ionos) utilisent encore Apache, rendant la maîtrise du .htaccess indispensable.
Ce guide couvre les règles de base WordPress, la compression Gzip/Brotli, le cache navigateur, la sécurisation et les redirections 301.
Les règles de base WordPress pour les permaliens
À l’installation, WordPress crée automatiquement ce bloc dans le .htaccess :
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Ce bloc dit à Apache : “Si le fichier ou dossier demandé n’existe pas physiquement, redirige vers index.php”. C’est ce qui permet à WordPress de gérer ses URLs propres (permaliens). Ne modifiez jamais ce bloc manuellement : WordPress le régénère via Réglages > Permaliens.
Activer la compression Gzip et Brotli
La compression réduit le poids des fichiers texte (HTML, CSS, JS) de 60 à 80 % avant envoi au navigateur.
# Compression Gzip
<IfModule mod_deflate.c>
# Compresser les types MIME courants
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/ld+json
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/woff
AddOutputFilterByType DEFLATE font/woff2
# Supprimer les bugs de compression pour certains navigateurs
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch MSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent
</IfModule>
# Compression Brotli (si le module est disponible)
<IfModule mod_brotli.c>
AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml
AddOutputFilterByType BROTLI_COMPRESS text/css application/javascript
AddOutputFilterByType BROTLI_COMPRESS application/json image/svg+xml
</IfModule>
Cache navigateur avec les Expires headers
Le cache navigateur évite de re-télécharger les ressources statiques (images, CSS, JS) à chaque visite. C’est l’une des optimisations PageSpeed les plus impactantes.
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
# HTML : court (contenu dynamique)
ExpiresByType text/html "access plus 0 seconds"
# CSS et JavaScript : long
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType text/javascript "access plus 1 year"
# Images : très long
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Polices
ExpiresByType font/ttf "access plus 1 year"
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
</IfModule>
# Cache-Control headers
<IfModule mod_headers.c>
<FilesMatch ".(css|js|jpg|jpeg|png|gif|webp|svg|ico|woff|woff2)$">
Header set Cache-Control "max-age=31536000, public, immutable"
</FilesMatch>
</IfModule>
Sécuriser WordPress avec le .htaccess
# Bloquer l'accès à xmlrpc.php (vecteur d'attaque fréquent)
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
# Protéger wp-config.php
<Files wp-config.php>
Order Deny,Allow
Deny from all
</Files>
# Bloquer l'accès aux fichiers sensibles
<FilesMatch "^(wp-config.php|.htaccess|readme.html|license.txt|wp-config-sample.php)$">
Order Allow,Deny
Deny from all
</FilesMatch>
# Bloquer l'accès direct aux fichiers PHP dans wp-includes
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
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]
</IfModule>
# Désactiver la navigation dans les répertoires
Options -Indexes
Redirections 301 propres avec le .htaccess
# Redirection simple (ancienne URL → nouvelle URL)
Redirect 301 /ancienne-page/ https://example.com/nouvelle-page/
# Redirection avec mod_rewrite (plus flexible)
<IfModule mod_rewrite.c>
RewriteEngine On
# HTTP vers HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# www vers non-www
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
# Redirection d'un ancien slug d'article
RewriteRule ^ancien-article/?$ /nouveau-article/ [R=301,L]
</IfModule>
.htaccess sur hébergements français : OVH, o2switch, Ionos
Quelques spécificités selon l’hébergeur :
| Hébergeur | Spécificité | Remarque |
|---|---|---|
| OVH Shared | mod_deflate disponible, mod_brotli non | Compression Gzip OK, Brotli non |
| o2switch | LiteSpeed avec .htaccess Apache compatible | Ajoutez aussi les règles LiteSpeed Cache |
| Ionos (1&1) | Certaines directives bloquées | Tester chaque règle individuellement |
| Infomaniak | Apache + mod_deflate + mod_headers | Toutes les règles fonctionnent |
Sur o2switch (LiteSpeed), préférez utiliser le plugin LiteSpeed Cache plutôt que les règles .htaccess manuelles pour la compression et le cache : LiteSpeed a ses propres directives plus efficaces.
Pour une optimisation technique complète de votre site WordPress, notre agence SEO technique Paris réalise des audits approfondis et implémente les meilleures pratiques.
Questions fréquentes sur le .htaccess WordPress
Mon site affiche une erreur 500 après modification du .htaccess, que faire ?
Une erreur 500 après modification du .htaccess signifie généralement une syntaxe incorrecte ou une directive non supportée par votre serveur. Reconnectez-vous via FTP, téléchargez le .htaccess actuel, supprimez ou commentez la dernière modification ajoutée (avec #), puis re-uploadez. Pour déboguer, activez LogLevel debug dans Apache ou consultez les logs d’erreurs de votre hébergement (cPanel > Error Logs).
Dois-je modifier le .htaccess directement ou via un plugin ?
Pour les optimisations courantes, des plugins comme WP Rocket, W3 Total Cache ou LiteSpeed Cache modifient automatiquement le .htaccess et gèrent les incompatibilités hébergeur. La modification manuelle est recommandée pour les développeurs qui veulent un contrôle précis et éviter les conflits entre plugins. Dans tous les cas, sauvegardez toujours le .htaccess original avant modification.
Le .htaccess est-il compatible avec Nginx ou LiteSpeed ?
Nginx n’utilise pas de .htaccess : sa configuration est définie dans des fichiers de configuration serveur. Si votre hébergement Nginx propose une compatibilité .htaccess, elle est partielle et limitée. LiteSpeed supporte nativement la syntaxe .htaccess Apache, donc les règles fonctionnent généralement, mais LiteSpeed a ses propres directives (RewriteRule en mode LSAPI) plus performantes.
Comment vérifier si la compression Gzip fonctionne sur mon site ?
Utilisez l’outil GTmetrix (onglet Waterfall) ou PageSpeed Insights : si Gzip est actif, les fichiers texte affichent un poids réduit en transfert. Vous pouvez aussi tester via curl -I -H "Accept-Encoding: gzip" https://votresite.com/ et vérifier la présence de Content-Encoding: gzip dans les headers de réponse.