Explication de .htaccess
Collez le fichier et chaque ligne reçoit une phrase qui dit ce qu’elle fait. Les motifs de réécriture sont décomposés morceau par morceau et les règles qui correspondent à des schémas d’infection connus sont marquées pour un examen plus attentif.
Une configuration qui vit dans le dossier
Un serveur web a un fichier de configuration principal que seul son administrateur peut modifier. Sur un hébergement mutualisé, ce n’est pas vous : Apache vous offre donc une autre porte d’entrée. C’est un fichier texte brut nommé .htaccess, placé dans un dossier du site, dont les instructions s’appliquent à ce dossier et à tout ce qu’il contient. Les serveurs LiteSpeed lisent le même fichier. nginx ne le lit pas et l’ignore complètement.
Le serveur relit le fichier à chaque requête : un changement prend donc effet dès que vous enregistrez. Une erreur aussi. Une seule directive mal orthographiée et toutes les pages répondent par une erreur 500 jusqu’à ce que vous corrigiez la ligne. Gardez une copie avant chaque modification.
Vous êtes rarement le seul auteur. WordPress écrit un bloc entre # BEGIN WordPress et # END WordPress et les extensions de cache, de sécurité et d’images ajoutent leurs propres blocs balisés. L’explication reconnaît les marqueurs d’environ 25 d’entre elles, dont WP Rocket, LiteSpeed Cache, Wordfence et Really Simple SSL et nomme le propriétaire de chaque bloc.
Lire une règle de réécriture à voix haute
mod_rewrite est l’endroit où la plupart des gens se perdent. Prenons cette paire :
RewriteCond %{HTTP_HOST} ^shop\.example\.com$ [NC]
RewriteRule ^products/(\d+)$ https://www.example.com/item?id=$1 [R=301,L]Elle se lit comme une phrase : « Si l’hôte demandé est shop.example.com, quelle que soit la casse et que le chemin est products/ suivi de chiffres, envoyer le visiteur de façon permanente vers la nouvelle adresse avec ces chiffres comme id et arrêter le traitement. »
- Une
RewriteCondest une condition sur une variable du serveur. Elle ne s’applique qu’à laRewriteRulesuivante. Plusieurs à la suite doivent toutes être vraies, sauf si l’une se termine par[OR]. - La première partie d’une
RewriteRuleest une expression régulière testée sur le chemin. Les parenthèses capturent du texte et$1,$2le réutilisent dans la destination.%1réutilise une capture de la dernière condition.
| Drapeau | Effet |
|---|---|
L | Dernière règle de ce passage. END arrête pour de bon. |
R=301 | Répondre par une redirection. 301 est permanente, 302 temporaire. Sans R, la réécriture est interne et la barre d’adresse du visiteur ne change pas. |
NC | Ignorer les majuscules et les minuscules. |
QSA | Garder la chaîne de requête d’origine et l’ajouter. |
F, G | Refuser avec un 403, ou répondre 410 Gone. |
P | Proxy : aller chercher le contenu sur un autre serveur et le servir comme le vôtre. |
Ce qui est signalé
Les attaquants qui obtiennent un accès en écriture à un site visent souvent .htaccess, parce que quelques lignes suffisent pour rediriger les visiteurs ou garder un script caché accessible. L’explication compare chaque ligne à des schémas observés dans de vraies infections et lui donne l’une de deux étiquettes.
Suspect, affiché en rouge :
- une redirection vers un autre domaine qui ne s’applique qu’aux visiteurs venant d’un moteur de recherche, ou seulement aux téléphones. Le propriétaire, qui tape l’adresse directement sur un ordinateur, ne la voit jamais ;
- un script PHP différent servi aux robots d’exploration des moteurs de recherche ;
AddHandler,AddTypeouSetHandlerqui font exécuter des fichiers image ou texte comme du PHP, ou des fichiers ordinaires comme des scripts CGI ;php_value auto_prepend_fileouauto_append_filequi charge un fichier avant ou après chaque script etallow_url_include;- un bloc
FilesMatchqui interdit tous les fichiers.php,.pyet.exe, suivi d’un bloc qui autorise une courte liste de fichiers PHP que WordPress ne fournit pas.
À vérifier, affiché en orange : les lignes dans le bloc WordPress qui ne font pas partie de ses règles standard, les conditions visant seulement les robots ou les référents, le drapeau [P], une page d’erreur hébergée sur un autre domaine, l’affichage du contenu des répertoires activé, des erreurs PHP affichées aux visiteurs, un pare-feu applicatif désactivé, des lignes de plus de 400 caractères ou remplies de base64 ou de caractères encodés et des caractères invisibles.
Deux erreurs de structure sont aussi signalées, puisque les deux provoquent un 500 : un bloc comme <IfModule> qui n’est jamais fermé et des directives qui ne sont permises que dans la configuration principale du serveur, comme DocumentRoot ou <VirtualHost>.
L’explication lit du texte. Elle n’exécute pas les règles, elle ne peut pas savoir quels modules votre serveur a chargés et elle ne voit pas les autres fichiers .htaccess des dossiers parents ni la configuration principale, qui changent tous le résultat. Un signalement veut dire « trouvez qui a ajouté ceci » et des extensions légitimes en déclenchent un de temps en temps. Un fichier sans signalement ne prouve pas que le site est propre.
Si une ligne est signalée et que ce n’est pas vous qui l’avez écrite
- Téléchargez une copie du fichier comme preuve avant de toucher à quoi que ce soit.
- Vérifiez la date de modification du fichier et cherchez d’autres fichiers modifiés au même moment, surtout des fichiers PHP dans les dossiers de téléversement et les noms cités dans les règles signalées.
- Supprimez les lignes hostiles, puis rechargez le fichier quelques minutes plus tard. Si elles sont revenues, un script sur le serveur le réécrit et supprimer des lignes ne suffira pas.
- Changez les mots de passe de l’hébergement, du FTP ou du SSH, de la base de données et de l’administrateur du CMS, puis mettez à jour le CMS avec toutes ses extensions et tous ses thèmes.
- Lancez la recherche de site dangereux pour voir si le site figure déjà sur une liste de blocage de navigateur et le suivi de redirections pour confirmer que les visiteurs arrivent là où ils le devraient.
Questions fréquentes
Où se trouve le fichier .htaccess ?
Dans le dossier racine du site, souvent appelé public_html, httpdocs ou www. Les sous-dossiers peuvent avoir le leur. Les noms qui commencent par un point sont cachés par défaut : activez donc « afficher les fichiers cachés » dans le gestionnaire de fichiers de votre hébergeur ou dans votre programme FTP.
Pourquoi mon site affiche-t-il une erreur 500 après que j’ai modifié .htaccess ?
Apache s’arrête à la première ligne qu’il ne peut pas interpréter. C’est généralement une faute de frappe dans le nom d’une directive, un bloc ouvert et jamais fermé, une directive que votre hébergeur n’autorise pas dans .htaccess, ou un module qui n’est pas installé. Restaurez votre copie, puis réajoutez vos modifications une à la fois.
Que signifie [L,R=301] dans une RewriteRule ?
R=301 dit au navigateur d’aller à la nouvelle adresse et de la retenir comme permanente. L empêche le serveur d’appliquer d’autres règles de réécriture à cette requête. Ensemble, elles forment la redirection permanente standard.
Comment savoir si mon fichier .htaccess a été piraté ?
Cherchez des règles que vous n’avez pas ajoutées : des redirections vers des domaines inconnus, des conditions sur HTTP_REFERER ou HTTP_USER_AGENT, des gestionnaires qui exécutent des images comme du PHP et auto_prepend_file. Comparez le bloc WordPress avec celui par défaut. Cette page signale ces schémas pour vous.
Est-ce que .htaccess fonctionne sur nginx ?
Non. nginx n’a pas de fichiers de configuration par dossier. Celui qui administre le serveur doit traduire les règles dans sa propre configuration. Certains hébergeurs font tourner nginx devant Apache et dans ce cas .htaccess s’applique encore aux requêtes qui atteignent Apache.
Le fichier que je colle est-il envoyé à votre serveur ?
Non. L’analyse est un script qui s’exécute dans votre navigateur. Prenez quand même l’habitude de retirer les mots de passe et les clés secrètes de tout ce que vous collez dans une page web.