413 Request Entity Too Large: příčiny a opravy
413 Payload Too Large, taky nazývaná 413 Request Entity Too Large, znamená, že tělo požadavku je větší než limit nastavený někde mezi klientem a aplikací. Server, nebo něco před ním, odmítlo tělo vůbec zpracovat, jakmile zjistilo nebo odhadlo, jak je velké.
Co znamená 413 Payload Too Large
RFC 9110 přejmenovává aktuální název na 413 Content Too Large, i když se starší 413 Payload Too Large a 413 Request Entity Too Large obě vztahují na stejný stavový kód a pořád se objevují napříč servery, frameworky i chybovými stránkami. Ať už je znění jakékoli, význam je identický: samotný požadavek byl syntakticky v pořádku, ale jeho tělo překročilo limit velikosti dřív, než ho server přijal ke zpracování. Nejčastěji se to stává při nahrávání souborů, ale může se to stát u jakéhokoli požadavku s velkým tělem, včetně hromadného obsahu API.
Jak se chyba projevuje
Prohlížeče obvykle zobrazí jakoukoli obyčejnou chybovou stránku, kterou pošle zpátky origin server nebo edge; pro tohle neexistuje žádné vyhrazené rozhraní prohlížeče jako u selhání spojení. Je běžné vidět to potichu selhat ve formuláři, kdy je odpověď vidět jen na kartě sítě, zvlášť u nahrávání souboru postaveného v JavaScriptu. Z příkazové řádky to odpověď potvrdí přímo:
curl -i -X POST -F "[email protected]" https://example.com/upload
HTTP/1.1 413 Request Entity Too Large
Content-Type: text/html
Přístupové a chybové logy serveru jsou nejspolehlivější místo, kde potvrdit přesnou zapojenou velikost a která vrstva to odmítla, protože požadavek může být zablokovaný na CDN, webovém serveru, nebo aplikaci, a každá z nich to zaznamenává jinak.
Co způsobuje 413
client_max_body_sizev nginx. Výchozí hodnota je 1 MB, což je dost malé na to, aby na to narazilo skoro každé skutečné nahrání souboru, dokud se výslovně nezvýší:client_max_body_size 20M;LimitRequestBodyv Apache. Nastavuje se podle adresáře nebo globálně, a stejně jako nginx má ve výchozím stavu velikost, kterou hodně aplikací přesáhne, aniž by to kdokoli záměrně změnil.upload_max_filesizeapost_max_sizev PHP. Dvě samostatná nastavení vphp.ini, která obě musí být dost velká pro dané nahrání;post_max_sizemusí být aspoň tak velké jakoupload_max_filesize, jinak druhé nastavení první potichu ořízne.maxAllowedContentLengthv IIS. Nastavuje se vweb.configpodrequestLimits, ve výchozím stavu asi 30 MB, a je oddělené od vlastního nastavenímaxRequestLengthASP.NET, které používá jiné jednotky a musí se zvýšit spolu s ním.- Limit nahrávání Cloudflare podle plánu. Plány Free a Pro omezují velikost těla požadavku na 100 MB bez ohledu na to, co by jinak přijal origin server, a tenhle limit nejde zvýšit z vlastní konfigurace originu; musí se to řešit na straně Cloudflare, nebo obejít přímou cestou nahrávání, která proxy obchází.
- Limity obsahu brány API. Spravované brány API běžně omezují těla požadavků výrazně pod to, co by povolil tradiční webový server, často v řádu jednotek megabajtů, což zasáhne týmy migrující existující funkci nahrávání za novou bránu.
Jak zjistit, čí je to chyba
Tohle skoro nikdy není chyba návštěvníka v tom smyslu, že by udělal něco špatně; soubor, který nahrává, je prostě větší než limit, který někde v řetězci existuje, a oprava patří tomu, kdo tuhle vrstvu vlastní. Pokud se stejný soubor v jednom prostředí v pořádku nahraje a v jiném selže, porovnejte každou vrstvu na cestě požadavku, protože nginx, PHP a CDN mohou mít každý jiný limit a vyhraje ten nejmenší. Spuštění HTTP kontroly s tělem požadavku blízkým vašemu zamýšlenému limitu, odeslané zvenčí vaší sítě, potvrdí, jaký je skutečný strop celou cestou, místo aby se spoléhalo na jediný konfigurační soubor.
Jak opravit chybu 413
Pokud jste návštěvník
- Zkomprimujte soubor před nahráním, zvlášť obrázky a videa, které se u typických velikostí často výrazně zmenší bez viditelné ztráty kvality.
- Rozdělte velké nahrání na menší části, pokud web podporuje nahrávání po částech nebo obnovitelné nahrávání, místo posílání jednoho velmi velkého požadavku.
- Zkontrolujte uvedený limit nahrávání webu, pokud je nějaký zveřejněný, protože některé 413 fungují přesně podle záměru a oprava je prostě menší soubor.
Pokud web provozujete
- Zvyšte limit v každé vrstvě společně, ne jen v jedné. Jeden požadavek obvykle prochází přes CDN, webový server, a běhové prostředí aplikace, a nejmenší nastavený limit kdekoli v tomhle řetězci určuje skutečný strop.
- Nastavte nginx a Apache výslovně, místo abyste se spoléhali na výchozí hodnoty:
# nginx client_max_body_size 20M; # Apache LimitRequestBody 20971520 - Sesouhlaste dvě nastavení PHP. Zvyšte
upload_max_filesizeipost_max_sizea ujistěte se, že druhé je rovné nebo větší než první. - Aktualizujte
requestLimitsIIS amaxRequestLengthASP.NET společně vweb.config, protože měří stejnou věc v jiných jednotkách a obě je potřeba zvýšit. - Obejděte limit plánu Cloudflare u skutečně velkých souborů nahráním přímo do úložiště pomocí podepsané URL, která proxírovanou cestu požadavku úplně obejde, místo abyste se snažili zvýšit limit, který daný stupeň plánu nenabízí.
- Zkontrolujte vlastní limit obsahu brány API odděleně od backendové služby, pokud je před vaší aplikací nějaká nasazená; může odmítnout požadavek dřív, než vůbec dostane šanci se uplatnit vaše vlastní, velkorysejší nastavení aplikace.
Jak předejít tomu, aby 413 blokovala skutečné uživatele
Příliš nízko nastavený limit je snadné přehlédnout, dokud na něj nenarazí někdo s velkým souborem, a do té doby to vypadá jako rozbitá funkce nahrávání, ne jako nesoulad konfigurace. Naplánovaná HTTP kontrola, která odesílá požadavek blízký vašemu zamýšlenému limitu velikosti, s ověřením očekávaného stavového kódu, potvrdí, že ho celý řetězec pořád přijímá po jakékoli změně CDN, webového serveru, nebo konfigurace aplikace. V kombinaci s monitoringem z více míst taky zachytí limit na úrovni CDN, který se uplatňuje jen na určitých edge uzlech.
Související chyby
Viz 400 Bad Request, kterou některé servery vrací místo 413 pro stejný stav předimenzovaného těla, přehled 4xx pro širší rodinu, a 406 Not Acceptable jinde v této dávce.
Často kladené otázky
Je 413 Payload Too Large totéž jako 413 Request Entity Too Large?
Ano. RFC 9110 přejmenovalo text stavu na 413 Content Too Large, ale oba starší názvy odkazují na identický stavový kód a význam, a všechna tři znění se pořád objevují v praxi podle verze softwaru serveru.
Proč mi nahrávání pořád selhává, i když jsem zvýšil client_max_body_size v nginx?
Jiná vrstva v řetězci, běžně post_max_size v PHP, pevný limit plánu CDN, nebo brána API, pravděpodobně nezávisle vynucuje menší limit. Velikost musí povolovat každá vrstva mezi klientem a aplikací, ne jen ta, kterou jste změnili.
Můžu zvýšit limit 100 MB Cloudflare na plánu free nebo pro?
Ne z vlastní konfigurace origin serveru; tenhle strop je pevně daný stupněm plánu. Obvyklé řešení je nahrávat velké soubory přímo do úložiště pomocí podepsané URL, která proxírovanou cestu požadavku obchází.
Počítá se 413 jako bezpečnostní blokace?
Obvykle ne. Většinou jde o přímočarý limit zdrojů, ne obrannou pravidlo, i když některé WAF skutečně používají neobvykle velká těla jako jeden signál z několika při rozhodování, jestli požadavek zablokovat.
Jaký je rozumný výchozí limit nahrávání, když jsem žádný nenastavil?
Neexistuje univerzální číslo; závisí to úplně na tom, co vaše aplikace legitimně potřebuje přijímat. Nastavte ho záměrně na základě svého největšího očekávaného legitimního souboru, místo abyste nechali výchozí hodnotu v každé vrstvě beze změny.