Ошибка 413 при загрузке: какой слой отклонил файл
При ошибке 413 сначала определите, какой участник отклонил тело запроса и дошла ли загрузка до приложения. Лимит nginx, общий POST-лимит PHP и предел одного файла — разные ограничения. Менять их все одновременно не нужно: исправляйте подтверждённую границу с учётом полного запроса и согласованного размера загрузки.
Установите место отказа
Сохраните адрес функции загрузки, время, HTTP-статус и безопасные сведения об ответе. Затем сопоставьте получение запроса на доступных участках: внешняя доставка, прокси, PHP и приложение. Название сервера на странице ошибки — подсказка, но не полный маршрут.
В документации nginx client_max_body_size ограничивает тело клиентского запроса и при превышении приводит к 413. Если отказ произошёл здесь, изменение только PHP не заставит этот запрос пройти дальше.
И наоборот: если приложение получило запрос и отказало по своему правилу, не надо автоматически обвинять внешний прокси. Требуется наблюдение, которое связывает конкретную попытку с конкретным этапом. Отсутствие записи в непроверенном журнале само по себе не доказывает неполучение.
Файл — только часть multipart-запроса
По RFC 7578 multipart/form-data состоит из частей, разделителей и заголовков частей. Внутри могут передаваться и файлы, и другие поля. Поэтому общий размер тела нельзя приравнять к сумме размеров выбранных файлов.
Учебный пример: два файла по 8 MiB дают 16 MiB только файловых данных. Если предел тела тоже 16 MiB, место для оформления multipart и дополнительных полей уже не предусмотрено. Это не рекомендуемый тарифный лимит и не замер браузерного запроса.
Точный служебный объём в примере не заявляется: он зависит от реального запроса. Для настройки согласуйте допустимый размер одного файла, их количество и общий бюджет формы. Запас выбирают по формату и измерениям, а не по произвольному проценту из чужой инструкции.
Таблица границ для одной загрузки
Следующая карта — предлагаемый протокол диагностики. Заполняйте только существующие в своей цепочке уровни. У внешнего посредника и у приложения могут быть собственные условия, которые надо подтвердить по действующей конфигурации.
| Участник | Что проверить | Подтверждение получения | Как выглядит разбор отказа | Что остаётся отдельным |
|---|---|---|---|---|
| Внешний посредник | Его ограничения для маршрута | Событие конкретной попытки | Определить, передал ли он запрос дальше | Настройки внутренних серверов |
| Nginx | Client_max_body_size нужного контекста | Согласованные сведения о запросе | Сопоставить 413 и действующий предел тела | Обработка каждого файла приложением |
| PHP: общий POST | Post_max_size | Вызов нужного обработчика | Проверить размер тела и разобранные поля | Предел одного файла |
| PHP: один файл | Upload_max_filesize | Результат обработки загрузки | Разобрать отказ именно этого файла | Суммарный объём всей формы |
| Приложение | Собственный договор загрузки | Обработка маршрута и её результат | Показать понятную причину пользователю | Ресурсы хранения и последующей обработки |
Что происходит на стороне PHP
В описании директив PHP post_max_size относится к POST-данным в целом, а upload_max_filesize — к одному загружаемому файлу. Для загрузки значение общего предела должно быть больше ограничения одного файла. Также существует отдельное ограничение числа одновременно загружаемых файлов.
Там же описано, что при превышении post_max_size массивы $_POST и $_FILES оказываются пустыми. Это отличается от обычного получения каждого файла с отдельным результатом. Само отсутствие полей, однако, нужно сопоставить с реальным запросом, а не считать единственной возможной причиной.
Не объявляйте любой PHP-отказ автоматически HTTP 413. Выясните, какой ответ формирует используемая цепочка. Пользователю нужна корректная причина, а разработчику — понимание, на каком этапе ещё доступны сведения для диагностики.
Проверяйте настройки действующего веб-обработчика
В документации конфигурации PHP поиск php.ini зависит, в частности, от SAPI и условий запуска. Поэтому значение, увиденное в командной строке, не подтверждает автоматически настройку обработчика этого сайта.
Запишите фактическую версию и способ запуска, используемые конфигурационные источники и порядок применения изменения. Не публикуйте полную диагностическую страницу с настройками среды для удобства проверки. Передайте необходимые значения уполномоченному специалисту в закрытой задаче.
Для поддержки сайта полезен паспорт загрузки: маршрут, поддерживаемый формат, число файлов и пределы. Так правка относится к реальной функции, а не к случайно найденному php.ini.
Большая загрузка требует бюджета после приёма
Успешная передача тела ещё не подтверждает, что сервер сможет обработать содержимое. Файлы могут потребовать временного хранения, преобразования и записи результата. Согласуйте параллельность и свободные ресурсы вместе с максимальным размером.
Мы советуем не отключать проверку размера и не поднимать все пределы до огромного значения. Ограничение должно соответствовать обещанной функции. Если нужен иной способ работы с большими данными, это отдельная задача, а не повод разрешить любой запрос.
Проверьте успех, отказ и сохранность формы
В собственной тестовой среде используйте небольшие безопасные файлы и ограниченные тестовые границы. Проверьте один файл, несколько файлов и ожидаемый отказ. Не нужно отправлять гигантскую загрузку на рабочий сервер ради воспроизведения.
Отказ должен оставить понятное состояние: что не принято, что можно изменить и нужно ли повторно выбрать вложения. Если форма содержит другие поля, проверьте их сохранение по согласованному сценарию. Повторная отправка не должна незаметно создавать несколько одинаковых записей.
- Сохраните точную попытку, ответ и согласованный размер загрузки.
- Нарисуйте фактическую цепочку до приложения.
- Найдите первый подтверждённый отказ по объёму тела или файла.
- Проверьте эффективную настройку нужного маршрута и обработчика.
- Рассчитайте общий бюджет формы и последующей работы.
- Измените только согласованную причину и подтвердите применение.
- Проверьте успешную загрузку, штатный отказ и отсутствие частичного результата.
Если ограничение связано с ресурсами, нужна поддержка сервера. Если не работает сообщение об ошибке или сохранение формы — доработка приложения. Закрывайте задачу по пользовательскому результату и подтверждённой границе, а не только по исчезновению числа 413.
Вопросы и ответы
Что значит ошибка 413 при загрузке файла?
Один из участников обработки отказал из-за допустимого объёма запроса. Сначала установите источник ответа и то, дошли ли данные до приложения.
Почему изменение client_max_body_size не помогло?
Проверьте эффективный контекст и следующий уровень обработки. У PHP и приложения могут оставаться отдельные ограничения, а внешняя цепочка может отклонять запрос раньше nginx.
Чем post_max_size отличается от upload_max_filesize?
Первое ограничивает POST-данные в целом, второе — один файл. Общий бюджет должен учитывать несколько файлов, поля и оформление запроса.
Читайте также
WordPress не сохраняет запись: ошибка допустимого JSON
ПоддержкаФото на сайте поворачивается после загрузки: что проверить
РазработкаЗапись голоса в браузере: какой файл получит ваш сервис
SEOКартинки не индексируются: что робот видит после загрузки
БизнесКак сравнить загрузку мастеров с разными сменами и услугами
РазработкаИз папки загрузились только 100 файлов: проверяем readEntries