Nginx Linux (Nginx)

Nginx — ошибка появляется только при загрузке файлов с кириллицей

  • Обновлено
  • Чтение ≈ 3 минуты
  • Нужны права администратора

Краткий ответ

Если форма принимает file.txt, но отклоняет «файл с пробелами и кириллицей.pdf», важно понять, где ломается передача имени: браузер, промежуточный Nginx, приложение, хранилище или отдельная проверка имени. Сам Nginx обычно не интерпретирует имя файла из multipart/form-data и не гарантирует его кодировку.

В этой статье
  1. Симптом и границы применимости
  2. Возможные причины и как их отличить
  3. Пошаговая диагностика и исправление
  4. Как проверить результат
  5. Если проблема не устранена

#Симптом и границы применимости

Если форма принимает file.txt, но отклоняет «файл с пробелами и кириллицей.pdf», важно понять, где ломается передача имени: браузер, промежуточный Nginx, приложение, хранилище или отдельная проверка имени. Сам Nginx обычно не интерпретирует имя файла из multipart/form-data и не гарантирует его кодировку.

#Возможные причины и как их отличить

Возможная причинаКак узнатьЧто делать
Приложение неверно декодирует имяMultipart-поле filename обрабатывается приложением.Запрос достигает PHP/приложения, но файл не создаётся или имя искаженоПроверить сохранение имени и нормализацию Unicode
Фильтр безопасности отклоняет особые символыФильтры могут анализировать имя в теле запроса.В логах WAF есть правило запрета filenameПроверить точное правило и ложное срабатывание
Неверный путь на файловой системеИмя в браузере и внутреннее имя файла не обязаны совпадать.Файлы с ASCII сохраняются, Unicode — ошибка записи или поискаСверить кодировку, права и безопасное имя хранения

#Пошаговая диагностика и исправление

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

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

#Как проверить результат

Тестовый файл с кириллицей успешно загружается, в системе сохраняется без повреждения, скачивается под ожидаемым именем. Файлы с ASCII, пробелами и похожими символами тоже корректны; опасные расширения по-прежнему блокируются.

#Если проблема не устранена

Если только кириллица не работает, изучайте код приложения/механизм WAF, а не HTTP/2 и тайм-ауты без доказательств. Если в заголовках имени видны проценты или искажённые символы, проверяйте реальный формат multipart с учётом RFC и библиотек.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.