#Симптом и границы применимости
Если форма принимает file.txt, но отклоняет «файл с пробелами и кириллицей.pdf», важно понять, где ломается передача имени: браузер, промежуточный Nginx, приложение, хранилище или отдельная проверка имени. Сам Nginx обычно не интерпретирует имя файла из multipart/form-data и не гарантирует его кодировку.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Приложение неверно декодирует имяMultipart-поле filename обрабатывается приложением. | Запрос достигает PHP/приложения, но файл не создаётся или имя искажено | Проверить сохранение имени и нормализацию Unicode |
| Фильтр безопасности отклоняет особые символыФильтры могут анализировать имя в теле запроса. | В логах WAF есть правило запрета filename | Проверить точное правило и ложное срабатывание |
| Неверный путь на файловой системеИмя в браузере и внутреннее имя файла не обязаны совпадать. | Файлы с ASCII сохраняются, Unicode — ошибка записи или поиска | Сверить кодировку, права и безопасное имя хранения |
#Пошаговая диагностика и исправление
- Сделайте три небольших контрольных файлаПодготовьте не содержащие личных данных файлы одинакового типа и размера: test.pdf, test-123.pdf и «тест-123.pdf». Загрузите по одному в тестовую область. Если все не загружаются, это общая ошибка загрузки, а не проблема кириллицы; не испытывайте большие файлы до уточнения причины.
- Запишите ответ в инструментах браузераОткройте страницу загрузки, нажмите F12 → вкладка «Сеть», повторите отправку тестового файла и откройте запрос (обычно POST). Сохраните код ответа и безопасный фрагмент сообщения, но не копируйте cookie, токены, весь multipart-пакет или приватные файлы.
- Определите, где запрос обрабатываетсяВ Nginx-конфигурации найдите location для URL и убедитесь, что запрос передаётся в proxy_pass/fastcgi_pass. Проверьте фактический error_log. Если Nginx вернул 413, это ограничение тела, обычно не связанное с кириллицей. Если 400/403 возникает только с кириллицей, проверьте фильтры и приложение.Linux · Терминал (Bash)КомандаНужен sudoSSH Linux, только чтение. Конфигурация может содержать секреты.
sudo nginx -T 2>&1 | grep -nE "client_max_body_size|proxy_pass|fastcgi_pass|error_log"
- Свяжите запись журнала со временем тестаСразу после отправки контрольного файла проверьте error_log и журнал приложения. В сообщениях о запрещённом запросе ищите корреляционный идентификатор WAF, если он есть. Не отключайте WAF целиком ради теста одного имени.
- Путь примерный: возьмите реальный error_log нужного server-блокаLinux · Терминал (Bash)КомандаНужен sudoПуть примерный: возьмите реальный error_log нужного server-блока.
sudo tail -n 80 /var/log/nginx/error.log
- Проверьте сохранение в приложенииДля PHP проверьте корректное чтение $_FILES и ошибки upload; сначала убедитесь, что файл существует во временном каталоге. Не используйте пользовательское имя как готовый путь: храните безопасный внутренний идентификатор, проверяйте тип, расширение и длину, а исходное имя — отдельным полем. Учтите возможную нормализацию Unicode.
- Точечно исправьте виновный слойЕсли виноват WAF, измените только конкретное подтверждённое ложное правило для безопасного маршрута. Если проблема в приложении, обновите библиотеку обработки multipart или исправьте её код с тестами; если в файловой системе, проверьте кодировку и права без массового chmod. При изменении Nginx заранее сохраните конфигурацию.Linux · Терминал (Bash)С осторожностьюНужен sudoВыполнять лишь после правок веб-сервера; обычные исправления приложения могут не требовать reload.
sudo nginx -t && sudo systemctl reload nginxКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
Тестовый файл с кириллицей успешно загружается, в системе сохраняется без повреждения, скачивается под ожидаемым именем. Файлы с ASCII, пробелами и похожими символами тоже корректны; опасные расширения по-прежнему блокируются.
#Если проблема не устранена
Если только кириллица не работает, изучайте код приложения/механизм WAF, а не HTTP/2 и тайм-ауты без доказательств. Если в заголовках имени видны проценты или искажённые символы, проверяйте реальный формат multipart с учётом RFC и библиотек.