在nginx发出错误413页之前,我需要能够处理超过最大nginx和php限制的上传文件大小。相反,我想在我的应用程序(symfony)对话框中发出错误消息。
要测试symfony中的文件大小限制,我的测试上传文件为600 Mb。当我在nginx下上传600 Mb文件时,上传运行到100%,然后 报告“ 413请求实体太大”。
如果我运行“app / console server:run”(使用symfony服务器而不是nginx),symfony会在上传之前报告gui中的错误(按预期)。
有没有办法修改nginx配置,使其读取$ _SERVER [CONTENT_LENGTH]或$ _SERVER [HTTP_CONTENT_LENGTH],中止上传,然后将拒绝的请求传递给应用程序? Symfony根据CONTENT_LENGTH标记错误(并且,通过解决symfony问题,HTTP_CONTENT_LENGTH)。
文件大小限制:
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
版本:
symfony 2.5.12
nginx 1.4.6-1ubuntu3.4
答案 0 :(得分:1)
您可以在nginx配置http块中增加允许的大小。
client_max_body_size 800m;
设置一个比php.ini中的值更高的值。然后nginx服务器不响应413,symfony显示正常的错误页面,因为php限制。
答案 1 :(得分:0)
我通过在javascript中捕获文件选择中的更改来解决此问题,然后弹出警告并在文件太大时清除选择。
我的预感是nginx不以任何方式解析传入的请求,即它不读取CONTENT_LENGTH或HTTP_CONTENT_LENGTH,并且完全根据请求的大小是否超过client_max_body_size来拒绝请求。如果这是真的(确认或拒绝会很好),那么在使用nginx时除了让nginx运行上传并遇到413错误(这对于大文件和/或慢速网络来说是耗时的)时,没有办法处理这个问题。
答案 2 :(得分:0)
Content-Length适用于非分块内容,但是我怀疑你的上传是分块的,然后nginx无法找出你内容的大小。 即使它可以,也不应该通过它。
按HTTP / 1.1规范: 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.