Une sauvegarde dans le dossier web est une fuite de code
Avant de modifier un gros fichier, le réflexe naturel est de le copier d'abord. cp index.php index.php.avant-modif, puis on travaille. Si ce fichier se trouve dans le dossier que le serveur web publie, vous venez de rendre tout votre code source téléchargeable en texte brut — identifiants de base de données, secrets, tout ce que le fichier contient.
Apache fait passer index.php par PHP parce qu'il se termine par .php. index.php.avant-modif ne se termine pas par .php. Il se termine par .avant-modif, dont Apache n'a jamais entendu parler : il fait donc la chose par défaut et envoie les octets.
La règle que la plupart écrivent, et pourquoi elle ne suffit pas
La protection habituelle est une liste d'extensions interdites : .bak, .orig, .save, .sql, .old. Elle attrape le fichier auquel vous avez pensé. Testée ici, cette liste a donné la bonne réponse pour probe.bak et la mauvaise pour chacun de ceux-ci :
index.php.vor-xyz— c'est ainsi que c'est réellement arrivéindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
Tous servis en 200. Le motif de nom auquel vous n'avez pas pensé est justement celui que vous emploierez, car on nomme ses sauvegardes d'après ce qu'on était en train de faire.
Inverser la coupe
La règle qui marche ne demande pas quelles extensions sont interdites. Elle pose une question de structure : ce nom de fichier contient-il une extension de code source qui n'est pas à la fin ?
Si oui, c'est la copie de quelque chose qui devait être exécuté, quoi que dise le suffixe qui suit. index.php.n-importe-quoi correspond. style.css.n-importe-quoi correspond. Le motif couvre les noms que personne n'a encore inventés, et c'est tout l'intérêt.
Vérifié aujourd'hui sur le serveur en service : les cinq noms ci-dessus renvoient maintenant 403, y compris ceux qui n'existent pas — la règle refuse la forme, pas le fichier.
L'exception, et ce qu'elle enseigne
Un nom de fichier légitime a ici exactement cette forme : les ressources pré-compressées s'écrivent style.css.1787777226.gz, une extension au milieu par conception. La règle porte donc une unique exception étroite pour un segment de chiffres suivi de .gz, et ce fichier renvoie 200 comme il se doit.
C'est sur ce genre d'exception que ces règles cèdent d'ordinaire ; il vaut donc la peine de dire ce qui rend celle-ci sûre : elle est assez étroite pour qu'on ne puisse pas construire index.php.quelquechose.gz et récupérer son code, car le segment du milieu doit être uniquement des chiffres. Une exception plus large — « tout ce qui finit par .gz » — aurait rendu la règle entière.
Et le conseil le plus simple reste celui qui rend tout cela inutile : gardez les sauvegardes hors du dossier publié. La règle est un filet pour le jour où vous oublierez, pas une autorisation de cesser de faire attention à l'endroit où atterrit la copie.