#Симптом и границы применимости
Apache принимает файл с латинским названием, но загрузка с кириллицей в имени обрывается либо приложение отвечает ошибкой. Часто проблема возникает в разборе multipart/form-data приложением, кодировке имени, проверке расширения или сохранении в хранилище. Не существует общей директивы Apache, «включающей кириллицу в именах загрузок».
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Приложение неверно обрабатывает исходное имяPHP и библиотеки могут по-разному обрабатывать Unicode/нормализацию. | ASCII-файл загружается, а такое же содержимое с русским именем — нет | Проверить обработку filename и хранение имени |
| Валидация или фильтр безопасности блокирует имяМодуль безопасности может проверять multipart-поля. | 403/406 и запись WAF при определённом заголовке | Найти конкретное правило вместо отключения WAF |
| Недопустимые символы в целевом хранилищеФайловое имя и URL-кодирование — разные уровни. | Upload проходит, ошибка возникает при сохранении или скачивании | Сверить файловую систему, кодировку и приложение |
#Пошаговая диагностика и исправление
- Проверьте ровно один факторСоздайте два безвредных маленьких текстовых файла одинакового содержания: test.txt и пример-имени.txt. Через обычную форму сайта загрузите сначала латинский, затем кириллический файл при одинаковых правах. Не загружайте чужие персональные документы и не тестируйте опасные расширения.
- Запишите ответ браузераВ браузере F12 → «Сеть» найдите запрос формы после загрузки; посмотрите код ответа и путь, не копируя токены или тело формы с личными данными. Если браузер не отправляет запрос, ищите ошибку JavaScript и ограничения формы. Если Apache возвращает 403, проверяйте WAF/правила; 500 обычно требует журнала приложения.
- Сопоставьте ошибку сервера и приложенияНа SSH найдите ErrorLog VirtualHost и журнал PHP-FPM приложения. По времени теста изучите записи, не публикуя пользовательские данные. Убедитесь, что директория назначения существует и доступна служебному пользователю; не назначайте всем папкам права 777.
- Имя службы и путь к ErrorLog зависят от сборки/панелиLinux · Терминал (Bash)КомандаНужен sudoИмя службы и путь к ErrorLog зависят от сборки/панели.
sudo apache2ctl -S; sudo journalctl -u apache2 -n 80 --no-pager
- Проверьте ограничители размера и WAF отдельноЕсли одинаковый файл с латинским именем проходит, общие LimitRequestBody и ограничения размера PHP менее вероятны, но серверный фильтр может реагировать на multipart-поля. Ищите идентификатор правила WAF по времени. Не выключайте mod_security или проверки типа файлов целиком; допустимо точечное исключение после изучения риска.
- Проверьте корректную обработку имени приложениемРазработчик должен принимать UTF-8 имя, нормализовать и отображать его безопасно, хранить пользовательское имя отдельно от безопасного серверного имени, не допускать ../ и разделителей каталогов. Если в PHP используется move_uploaded_file, путь сохранения должен быть выбран сервером, а не напрямую составлен из непроверенного имени. Исправление делайте на копии, с тестовым файлом.
- Проверьте сохранение и скачиваниеПовторно загрузите разрешённый файл, затем скачайте его через интерфейс сайта. Ожидаются правильное исходное имя и неизменённое содержимое. Если в ссылке кириллица, убедитесь, что приложение правильно кодирует URL и заголовок Content-Disposition. При сбое откатите только изменённый обработчик, а не Apache целиком.
#Как проверить результат
После исправления оба одинаковых текстовых файла успешно загружаются, хранятся и скачиваются; оригинальное имя показывается правильно; недопустимые типы, размер и каталоги продолжают блокироваться.
#Если проблема не устранена
Если запрос обрывается до приложения, проверяйте конкретное правило WAF и промежуточный прокси; если приложению передан файл, но имя испорчено — ищите Unicode/кодировку в приложении и базе.