#Симптом и границы применимости
При загрузке одинакового содержимого под разными именами проблема обычно находится в обработке multipart/form-data, проверке Unicode-имени приложением, WAF или сохранении файла. Универсальной кнопки «включить кириллицу» в панели хостинга нет.
Эта инструкция относится к конкретному сайту в панели управления хостингом, когда его обслуживают Nginx, Apache, PHP-FPM или их сочетание. Названия разделов и доступность SSH зависят от установленной панели и прав пользователя; шаги, которых нет в вашем интерфейсе, выполняет администратор сервера.
#Возможные причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверная обработка имени в приложенииС одинаковым размером ASCII-имя проходит, русское — нет | Ошибка 500 в PHP либо некорректное имя после сохранения | Разобрать обработчик загрузки и Unicode |
| Фильтр безопасностиВ журнале WAF записан запрет на поле filename | При загрузке получается 403/406 | Проверить конкретное сработавшее правило |
| Путь или хранилищеФайл принят, но не открывается по ссылке | Сбой при move_uploaded_file, скачивании или URL-кодировании | Разделить безопасный серверный путь и отображаемое имя |
#Пошаговая диагностика и исправление
- Создайте пару полностью безвредных файловСделайте два маленьких текстовых файла с одинаковым содержимым: test.txt и пример.txt. В форме вашего сайта по очереди загрузите их под одной учётной записью. Не используйте клиентские документы и запрещённые расширения.
- Снимите код ответа в браузереОткройте инструменты разработчика F12 → «Сеть», повторите тест и изучите код ответа и точный адрес обработчика. Если запрос вообще не отправлен — проверьте JavaScript/проверку формы; 403 указывает на правило доступа, 500 — на сервер/приложение.
- Найдите именно журналы обработчикаВ панели выберите сайт и откройте его журнал ошибок; при наличии доступа сопоставьте записи Nginx, Apache, PHP-FPM и WAF по времени. Не копируйте содержимое multipart-запроса с личными данными.
- Исключите размер как причинуОба тестовых файла должны иметь одинаковые содержимое и размер; если латинское имя проходит, изменение client_max_body_size или PHP upload_max_filesize обычно не устраняет проблему именования. Проверьте их только если журналы прямо показывают 413/ошибку размера.
- Проверьте безопасное формирование имениРазработчик должен хранить отображаемое исходное имя отдельно от безопасного имени в хранилище, нормализовать Unicode по необходимости, запрещать ../ и разделители путей. Нельзя напрямую использовать пользовательское filename как абсолютный путь сохранения.
- Проверьте ответ WAF и кодировку базыЕсли защита отклоняет запрос, найдите номер конкретного правила; не выключайте WAF полностью. Если имя попало в базу и испортилось, проверьте соединение UTF-8 и типы полей на тестовой копии, а не меняйте кодировку всей базы без резервной копии.
- Проверьте загрузку, отображение и скачиваниеПосле исправления повторите оба теста, откройте список файлов и скачайте их через интерфейс. Ожидаются корректные имена и неизменённый текст; при ошибке верните конкретное изменение обработчика и сравните журналы.
#Проверка результата
Разрешённые файлы с ASCII- и русскими названиями загружаются, отображаются и скачиваются правильно; защита от небезопасных путей и типов файлов действует.
#Если проблема осталась
Если проблема проявляется только при скачивании, изучите Content-Disposition и URL-кодирование; если файл не сохраняется — сосредоточьтесь на приложении и правах хранилища.
#Безопасный откат
Если после изменения ошибка усилилась, верните сохранённое значение только изменённого параметра и повторно проверьте конфигурацию используемого веб-сервера до применения. Не возвращайте всю базу или весь сервер из резервной копии, если достаточно откатить одну настройку. При отсутствии доступа к нужному уровню обратитесь к администратору с точными временем, адресом, кодом ответа и обезличенными фрагментами журналов.