HTTPQUERY
Русский

413 Content Too Large

Применение

Когда получено сообщение об ошибке 413 Content Too Large, клиент отправляет тело запроса, слишком большое для сервера. Типичный пример — когда клиент пытается отправить файл допустимого типа и формата, но файл превышает ограничение по размеру. Например, изображения часто имеют неоправданно высокое разрешение и становятся существенно меньше без ущерба для предполагаемого использования. Вместо того чтобы брать на себя обязанность изменять файлы изображений, сервер отказывается от передачи и рассчитывает, что клиент выполнит необходимую обработку.

В таких ситуациях клиент заранее, до начала PUT, проверяет допустимый размер файла с помощью заголовка Expect: 100-continue. Сервер подтверждает, и в ответ на это тело сообщения либо отправляется, либо нет.

Сервер может дополнительно отправить в ответе заголовок Retry-After. Если он присутствует, клиент повторяет запрос по прошествии указанного периода или в указанные дату и время. Например, если клиент исчерпал недельную квоту на загрузку или крупные загрузки запрещены в часы пик, сервер предложит повторить попытку в более подходящее время.

Если ситуация возникает из-за того, что на сервере закончилось место для хранения, сервер отправляет 507.

Сервер включает заголовок Connection: close, чтобы разорвать соединение и не дать клиенту отправить тело сообщения.

Примечание

WAF и межсетевые экраны CDN (Cloudflare, AWS WAF) применяют ограничения на размер тела независимо от сервера-источника. Проверьте журналы WAF/межсетевого экрана, если ограничение на сервере-источнике выше размера полезной нагрузки. Способы уменьшить размер полезной нагрузки: сжать с помощью Content-Encoding: gzip, реализовать постраничную выдачу для больших наборов результатов, использовать многочастную или возобновляемую загрузку для крупных файлов.

Влияние на SEO

Поисковые системы, такие как Google, не индексируют URL со статусом ответа 413. Ранее проиндексированные URL будут удалены из результатов поиска.

Пример

Клиент пытается отправить файл, и сервер отвечает 413 Content Too Large, потому что в данный момент наблюдается высокая нагрузка. Сервер отклоняет запрос, закрывает соединение и предлагает клиенту повторить попытку через 30 минут.

Запрос

PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000

Ответ

HTTP/1.1 413 Content Too Large
Retry-After: 1800
Connection: close
Content-Type: text/html
Content-Length: 188

<html>
  <head>
    <title>File Too Large</title>
  </head>
  <body>
   <p>Too much server traffic to accept the transfer
   at this time. Try again after 30 minutes.</p>
  </body>
</html>

Как исправить

Ошибка возникает на том уровне стека, который первым применяет ограничение размера: веб-сервер, обратный прокси, CDN или фреймворк приложения. Определите уровень, возвращающий 413, и измените ограничение именно там.

nginx: задайте client_max_body_size в блоке http, server или location. Значение 0 полностью отключает проверку (не рекомендуется в продакшене). После изменения значения перезапустите nginx.

Apache: задайте LimitRequestBody в httpd.conf или .htaccess. Значение указывается в байтах, поэтому 10 МБ — это 10485760. Перезагрузите Apache, чтобы применить изменения.

IIS: отредактируйте атрибут maxAllowedContentLength в файле web.config в разделе system.webServer > security > requestFiltering > requestLimits.

PHP: настройте оба параметра upload_max_filesize и post_max_size в php.ini. Значение post_max_size должно быть равно upload_max_filesize или больше него.

Node.js / Express: задайте параметр limit в body-parser или во встроенном промежуточном ПО Express для JSON/URL-encoded, например express.json({ limit: ‘50mb’ }).

Cloudflare: тарифы Free и Pro ограничивают загрузки 100 МБ, Business — 200 МБ, Enterprise — 500 МБ. Загрузки, превышающие эти ограничения, возвращают 413, не доходя до источника. Для загрузки крупных файлов за Cloudflare обходите прокси или используйте стратегии фрагментированной загрузки.

На стороне клиента сжимайте или разбивайте на части крупные полезные нагрузки перед отправкой. Для загрузки файлов реализуйте многочастные или возобновляемые протоколы загрузки, чтобы укладываться в серверные ограничения. Используйте механизм Expect: 100-continue, чтобы проверить, примет ли сервер полезную нагрузку такого размера, до передачи всего тела.

Примеры кода

.NET

HttpStatusCode.RequestEntityTooLarge

Rust

http::StatusCode::PAYLOAD_TOO_LARGE

Rails

:payload_too_large
:request_entity_too_large

Go

http.StatusRequestEntityTooLarge

Symfony

Response::HTTP_REQUEST_ENTITY_TOO_LARGE

Python3.5+

http.HTTPStatus.REQUEST_ENTITY_TOO_LARGE

Java

java.net.HttpURLConnection.HTTP_ENTITY_TOO_LARGE

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_REQUEST_TOO_LONG

Angular

@angular/common/http/HttpStatusCode.PayloadTooLarge