2016-07-07 10 views
0

Ich muss in der Lage sein, mit hochgeladenen Dateien umzugehen, die die maximalen nginx- und php-Limits überschreiten, bevor nginx eine 413-Fehlerseite ausgibt. Stattdessen möchte ich eine Fehlermeldung in meinem Anwendungsdialog (Symfony) ausgeben.Nginx: Verweis auf zu große Dateien Uploads in die Anwendung?

Um die Dateigrößenbeschränkungen in Symfony zu testen, ist Meine Test-Upload-Datei 600 Mb. Wenn ich die 600 Mb-Datei unter nginx hochlade, läuft der Upload zu 100%, dann meldet Berichte "413 Request Entity Too Large".

Wenn ich "app/console server: run" ausführe (das den symfony Server anstelle von nginx verwendet), meldet symfony den Fehler in der GUI, bevor der Upload erfolgt (wie vorgesehen).

Gibt es eine Möglichkeit, die nginx-Konfiguration zu ändern, so dass es $ _SERVER [CONTENT_LENGTH] oder $ _SERVER [HTTP_CONTENT_LENGTH] liest, den Upload abbricht und die abgelehnte Anfrage an die App weiterleitet? Symfony kennzeichnet den Fehler abhängig von CONTENT_LENGTH (und bei einem Workaround für ein Symfony-Problem HTTP_CONTENT_LENGTH).

Dateigröße Grenzen:

src/my_app/CoreBundle/Resources/config/validation.yml: maxSize: '500M' 
/etc/php5/cgi/php.ini:post_max_size = 550M 
/etc/php5/cgi/php.ini:upload_max_filesize = 500M 
/etc/php5/cli/php.ini:post_max_size = 550M 
/etc/php5/cli/php.ini:upload_max_filesize = 500M 
/etc/php5/fpm/php.ini:post_max_size = 550M 
/etc/php5/fpm/php.ini:upload_max_filesize = 500M 

Versionen:

symfony 2.5.12   
nginx 1.4.6-1ubuntu3.4 

Antwort

1

Sie können die zulässige Größe in der nginx Config http Block erhöhen.

client_max_body_size 800m; 

Legen Sie einen Wert fest, der höher ist als der Wert in Ihrer php.ini. Dann reagiert der Nginx-Server nicht mit 413 und symfony zeigt die normale Fehlerseite wegen der php-Beschränkung an.

+0

Danke, Crofly. Wenn Sie das Limit erhöhen, dauert es länger, bis das gleiche Problem bei> 800 MB-Dateien auftritt. Ich muss das Problem beheben können, bevor der Upload gestartet wird. – MgFrobozz

0

Ich habe daran gearbeitet, indem ich Änderungen in der Dateiauswahl in Javascript abgefangen habe, dann eine Warnung ausgegeben und die Auswahl gelöscht habe, wenn die Datei zu groß ist.

Meine Ahnung ist, dass nginx die eingehende Anfrage in keiner Weise syntaktisch analysiert, dh es liest weder CONTENT_LENGTH noch HTTP_CONTENT_LENGTH und lehnt die Anfrage rein auf der Basis ab, ob die Größe der Anfrage client_max_body_size überschreitet. Wenn das stimmt (Bestätigung oder Verweigerung wäre großartig), gibt es keine Möglichkeit, dies zu tun, wenn nginx verwendet wird, außer dass nginx den Upload ausführt und den 413-Fehler findet (was für eine große Datei und/oder ein langsames Netzwerk zeitaufwendig ist). .

0

Content-Length funktioniert mit nicht-chunked Inhalt, aber ich vermute, dass Ihr Upload chunked wird und dann gibt es keine Möglichkeit, dass Nginx herausfinden kann, wie groß der Inhalt ist. Auch wenn es könnte, sollte es nicht passieren.

von HTTP/1.1 Spezifikationen: http://www.ietf.org/rfc/rfc2616.txt:

3.If a Content-Length header field (section 14.13) is present, its 
decimal value in OCTETs represents both the entity-length and the 
transfer-length. The Content-Length header field MUST NOT be sent 
if these two lengths are different (i.e., if a Transfer-Encoding 
header field is present). If a message is received with both a 
Transfer-Encoding header field and a Content-Length header field, 
the latter MUST be ignored. 
Verwandte Themen