Копия в веб-каталоге — это утечка исходников
Перед правкой большого файла естественно сначала его скопировать. cp index.php index.php.pered-pravkoj, потом работать. Если этот файл лежит в каталоге, который публикует веб-сервер, вы только что сделали весь свой исходный код скачиваемым как простой текст — доступы к базе, секреты, всё, что в файле оказалось.
Apache пропускает index.php через PHP, потому что он кончается на .php. index.php.pered-pravkoj не кончается на .php. Он кончается на .pered-pravkoj, о чём Apache никогда не слышал, поэтому делает то, что по умолчанию, и отдаёт байты.
Правило, которое пишут почти все, и почему его мало
Обычная защита — список запрещённых расширений: .bak, .orig, .save, .sql, .old. Он ловит тот файл, о котором вы подумали. Проверено здесь: этот список дал верный ответ для probe.bak и неверный для каждого из этих:
index.php.vor-xyz— так это и случилось на самом делеindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
Все отданы с кодом 200. Образец имени, о котором вы не подумали, — ровно тот, которым вы и воспользуетесь, потому что копии называют по тому, что делали в этот момент.
Перевернуть разрез
Правило, которое работает, не спрашивает, какие расширения запрещены. Оно задаёт вопрос о строении: содержит ли это имя файла исходное расширение, стоящее не в конце?
Если да, это копия того, что должно было исполняться, что бы ни говорил суффикс после. index.php.что-угодно подходит. style.css.что-угодно подходит. Образец покрывает имена, которых ещё никто не выдумал, и в этом весь смысл.
Проверено сегодня на работающем сервере: все пять имён выше теперь дают 403, включая те, которых не существует — правило отказывает форме, а не файлу.
Исключение и чему оно учит
Одно законное имя файла здесь имеет ровно такую форму: предварительно сжатые файлы пишутся как style.css.1787777226.gz, расширение посередине по замыслу. Поэтому правило несёт одно узкое исключение для цифрового отрезка, за которым идёт .gz, и этот файл отдаётся с 200, как и должен.
Именно на таком исключении эти правила обычно и ломаются, так что стоит сказать, что делает это безопасным: оно узко настолько, что нельзя собрать index.php.что-нибудь.gz и получить свой исходник обратно, ведь средний отрезок должен состоять только из цифр. Более широкое исключение — «всё, что кончается на .gz» — отдало бы правило целиком.
А простейший совет остаётся тем, который делает всё это ненужным: держите копии вне публикуемого каталога. Правило — это сетка на тот день, когда вы забудете, а не разрешение перестать следить, куда падает копия.