Le code 403 Forbidden signifie que le serveur a compris la requête et refuse de la servir. Ce n’est pas une ressource introuvable, ni un identifiant manquant. Si le serveur voulait que le client s’authentifie, il devrait répondre 401. Ici, répéter la même requête avec le même compte ne change rien : la règle qui refuse est ailleurs.
D’où vient un 403 sur un site réel
Les causes habituelles ne se recouvrent pas avec celles d’un 401.
- Les droits du système de fichiers. Le processus du serveur web ne peut pas lire le fichier ou traverser un dossier. Le journal parle alors de permission, pas d’un utilisateur applicatif.
- Une règle du serveur.
.htaccessou la configuration Nginx contientRequire all denied, undeny, ou une liste d’IP. Le dossierwp-adminou un répertoire d’upload est souvent visé après un durcissement. - Un pare-feu applicatif. ModSecurity ou un WAF hébergé classe une requête normale en attaque. Les recherches avec une apostrophe, les URL longues de filtres e-commerce et certains corps JSON déclenchent de faux positifs. L’identifiant de règle est dans le journal d’audit.
- Un rôle insuffisant. L’utilisateur WordPress est connecté, mais l’action demandée n’est pas dans ses capacités. L’API REST répond 403 avec un code du type
rest_forbidden. - Un nonce invalide. WooCommerce ou le cœur WordPress refuse un formulaire dont le jeton a expiré ou a été servi depuis un cache. Le code interne ressemble à
rest_cookie_invalid_nonce. - Un blocage par pays ou par hotlink. L’image s’affiche sur votre domaine et répond 403 partout ailleurs.
Aucune de ces situations ne se règle en régénérant un mot de passe.
Isoler la règle
Notez l’URL exacte, le verbe HTTP et si vous étiez connecté.
- Ouvrez la même URL en navigation privée et depuis un partage de connexion. Si seul votre IP de bureau passe, la liste d’autorisation est en cause.
- Lisez le corps de la réponse. Un message ModSecurity, un texte « Sorry, you are not allowed to access this page » de WordPress, ou une page nue du serveur ne désignent pas le même composant.
- Cherchez dans le journal du WAF l’identifiant de règle à la minute du refus.
- Si le 403 n’existe qu’après une mise en cache, comparez deux chargements du formulaire. Un nonce identique servi à tout le monde est un cache de page connectée.
- Contrôlez depuis l’extérieur avec un test d’URL, sans cookie d’administration. Une fiche produit en 403 pour tout le monde n’est pas un simple compte de test.
Si le refus coïncide avec un utilisateur administrateur que vous n’avez pas créé, arrêtez les essais de droits et passez par la procédure pour nettoyer un WordPress infecté.
Lever le blocage sans ouvrir le site
| Constat | Action |
|---|---|
| Fichier illisible par le serveur | Rétablir la lecture pour l’utilisateur du serveur web, pas pour « tout le monde » |
Require all denied trop large | Limiter la règle au fichier visé (xmlrpc.php, un backup), pas à tout le site |
| Règle WAF identifiée | Désactiver cette règle sur l’URL concernée, après avoir lu ce qu’elle cherchait |
| Rôle trop faible | Donner la capacité manquante, ou utiliser un compte adapté |
| Nonce en cache | Exclure la page du cache pleine page |
| Blocage géographique non voulu | Retirer le pays réellement ciblé par vos clients |
Rejouez la requête qui échouait. Puis vérifiez qu’une URL qui doit rester interdite l’est encore : un correctif qui « répare » le 403 en autorisant tout le serveur a simplement déplacé le problème.
Ce qu’il ne faut pas faire
Ne passez pas les dossiers en 777. Le 403 disparaît parfois, et n’importe qui peut alors écrire dans le site. Ne coupez pas le WAF entier pour une règle. Ne confondez pas avec un 401 : ajouter un mot de passe Basic devant une URL déjà refusée par ModSecurity empile deux contrôles. Ne masquez pas le 403 par une redirection vers l’accueil : le visiteur et le moteur voient un détour, pas la page.
Une URL métier qui répond 403 de façon intermittente se suit comme le reste de la disponibilité. La méthode pour tester si un site répond vraiment sert ici à séparer un refus local, lié à votre IP ou à votre session, d’un refus pour tous les visiteurs.
