Erreur 403 dans wp-admin de WordPress sur load-styles.php / load-scripts.php (Wordfence WAF / auto_prepend_file)
Résumé
Après une mise à jour de WordPress ou d'une extension, certains sites affichent soudainement un écran wp-admin défaillant :
- La connexion fonctionne, mais le tableau de bord d'administration s'affiche sans mise en forme, vide ou partiellement chargé.
- Dans les outils de développement du navigateur → Réseau, on constate 403 Forbidden pour :
wp-admin/load-styles.phpwp-admin/load-scripts.php
- Désactiver les extensions depuis wp-admin, ou même renommer
wp-content/plugins, ne pas corrige pas l'erreur 403.
Dans de nombreux cas, la cause fondamentale est le pare-feu applicatif Web Wordfence (WAF) est toujours chargé via auto_prepend_file dans .htaccess et/ou .user.ini, même après la désactivation de l'extension.
Symptômes
- L'interface d'administration WordPress se charge partiellement ou sans CSS/JS.
- In your browser’s DevTools → Network tab:
wp-admin/load-styles.phpet/ouwp-admin/load-scripts.phpaffichent 403 Forbidden.
- Le journal d'erreurs Apache affiche des lignes similaires à :
[authz_core:error] AH01630: client denied by server configuration: /home/USER/public_html/wp-admin/load-styles.php [authz_core:error] AH01630: client denied by server configuration: /home/USER/public_html/wp-admin/load-scripts.php - Renommer
wp-content/pluginsou désactiver les extensions depuis le tableau de bord ne permet pas pas de résoudre l'erreur.
Cause première
Lorsque le pare-feu Wordfence WAF est activé en mode Extended Protection il ne s'agit pas d'une simple extension WordPress classique. Il s'injecte également dans PHP via auto_prepend_file.
Plus précisément, Wordfence :
- Ajoute une directive
auto_prepend_fileà votre configuration PHP via :.htaccess(Apache).user.ini(paramètres PHP par répertoire)
- Fait pointer cette directive vers un fichier d'amorçage tel que :
# In .htaccess php_value auto_prepend_file /home/USER/public_html/wordfence-waf.php; In .user.ini auto_prepend_file = "/home/USER/public_html/wordfence-waf.php"
Cela force chaque requête PHP (frontend, wp-admin, AJAX, cron, etc.) à charger wordfence-waf.php avant le WordPress. Même si vous désactivez ou supprimez l'extension Wordfence, l'amorçage du WAF peut tout de même :
- Bloquer certains chemins (par ex.
load-styles.php,load-scripts.php,wp-cron.php), ou - Échouer en raison d'un code obsolète ou incompatible après une mise à niveau de WordPress ou de PHP.
Comme cela s'exécute au niveau de PHP / Apache, il ne suffit pas de désactiver l'extension dans wp-admin.
Comment confirmer que Wordfence / auto_prepend_file est en cause
1. Check Apache / PHP error logs
Look in your virtual host or global Apache error log for lines like:
[authz_core:error] AH01630: client denied by server configuration: /home/USER/public_html/wp-admin/load-styles.php
[authz_core:error] AH01630: client denied by server configuration: /home/USER/public_html/wp-admin/load-scripts.php
Si vous constatez des erreurs 403 sur ces points de terminaison du cœur de WordPress et que la désactivation habituelle des extensions n’y change rien, soupçonnez le WAF / auto_prepend_file.
2. Vérifier .user.ini dans le document root
- Via SSH ou le gestionnaire de fichiers, accédez à la racine de votre site (root) (par exemple
/home/USER/public_html). - Ouvrez
.user.iniet recherchez une ligne similaire à :auto_prepend_file = "/home/USER/public_html/wordfence-waf.php"
3. Vérifier .htaccess pour le WAF de Wordfence
- Dans le même répertoire, ouvrez
.htaccess. - Recherchez un bloc du WAF de Wordfence, par exemple :
# Wordfence WAF # <IfModule mod_php7.c> php_value auto_prepend_file /home/USER/public_html/wordfence-waf.php # </IfModule>
If these exist, Wordfence WAF is still being injected into every PHP request, even if the plugin is deactivated.
Solution : désinstaller correctement le WAF de Wordfence
Avertissement : Only do this if you intend to disable Wordfence WAF. If you still want Wordfence, use its own UI to reconfigure Extended Protection.
Step 1: Disable Wordfence plugin (if possible)
- Connectez-vous à wp-admin.
- Accédez à Extensions → Extensions installées.
- Désactiver Wordfence Security.
Si wp-admin est totalement inaccessible, vous pouvez ignorer cette étape et passer directement à la modification des fichiers.
Étape 2 : supprimer auto_prepend_file de .user.ini
- Dans le document root de votre site WordPress, ouvrez
.user.ini. - Repérez la ligne de Wordfence :
auto_prepend_file = "/home/USER/public_html/wordfence-waf.php" - Commentez-la ou supprimez-la, par exemple :
; auto_prepend_file = "/home/USER/public_html/wordfence-waf.php" - Enregistrez le fichier.
Étape 3 : Supprimer auto_prepend_file de .htaccess
- Dans le même répertoire, ouvrez
.htaccess. - Recherchez le bloc du pare-feu Wordfence WAF, par exemple :
# Wordfence WAF <IfModule mod_php7.c> php_value auto_prepend_file /home/USER/public_html/wordfence-waf.php </IfModule> - Mettez-le en commentaire ou supprimez-le :
# Wordfence WAF disabled # <IfModule mod_php7.c> # php_value auto_prepend_file /home/USER/public_html/wordfence-waf.php # </IfModule> - Enregistrez le fichier.
Étape 4 : Vider le cache opcode / redémarrer PHP (facultatif mais recommandé)
- Si vous utilisez PHP-FPM / LSAPI / FastCGI, redémarrez PHP-FPM ou LiteSpeed / Apache.
- Vous pouvez également demander à votre hébergeur de vider le cache opcache PHP pour ce compte.
Étape 5 : Tester wp-admin
- Ouvrez
/wp-admin/dans votre navigateur. - Ouvrez les DevTools → Réseau, puis rechargez la page.
- Vérifiez :
wp-admin/load-styles.phprenvoie 200 OK.wp-admin/load-scripts.phprenvoie 200 OK.- The admin interface looks normal again (CSS/JS loaded).
Si vous avez précédemment ajouté des règles de substitution temporaires (par exemple un wp-admin/.htaccess autorisant sans condition ces fichiers), vous pouvez les supprimer une fois que tout fonctionne normalement.
Facultatif : nettoyer les fichiers de Wordfence
If you are completely done with Wordfence, you can also:
- Supprimer ou renommer :
wp-content/plugins/wordfence/wp-content/wflogs/(répertoire des journaux)
- Supprimer
wordfence-waf.phpfrom your document root if it is no longer referenced anywhere.
Preventing Future Issues
- Be aware that security plugins with WAF / “Extended Protection” can modify:
.htaccess.user.ini- Le comportement global de PHP via
auto_prepend_file
- Disabling the plugin from the dashboard does pas supprimez automatiquement ces hooks de bas niveau.
- Si vous constatez des erreurs 403 inhabituelles ou le message “client denied by server configuration” sur des fichiers essentiels de WordPress tels que
load-styles.php,load-scripts.phpouwp-cron.php, vérifiez toujours la présence de :auto_prepend_filelignes dans.user.iniet.htaccess.- Fichiers d'amorçage du WAF résiduels, tels que
wordfence-waf.php.
Résumé
Problème : Administration WordPress inaccessible, load-styles.php / load-scripts.php renvoyant une erreur 403, même après la désactivation des extensions.
Cause : Le WAF de Wordfence est toujours injecté via auto_prepend_file dans .htaccess / .user.ini, chargeant wordfence-waf.php à chaque requête et bloquant ces points d'accès.
Solution :
- Désactivez l'extension Wordfence (si possible).
- Supprimer
auto_prepend_fileréférences àwordfence-waf.phpde.htaccesset.user.ini. - Rechargez PHP / Apache et testez de nouveau wp-admin — les erreurs 403 sur
load-styles.php/load-scripts.phpdevraient disparaître.