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