绕过 Elasticbeanstalk 中托管的 api 响应上的 NGINX 413 错误页面

Posted

技术标签:

【中文标题】绕过 Elasticbeanstalk 中托管的 api 响应上的 NGINX 413 错误页面【英文标题】:Bypass NGINX 413 error page on api response hosted in Elasticbeanstalk 【发布时间】:2020-10-17 12:42:30 【问题描述】:

我最近将我们用 apache 托管的旧 Laravel 应用程序迁移到了一个新的以 nginx 作为代理服务器的 elasticbeanstalk。除了最大上传大小外,一切都按预期工作。我已经实现了client_max_body_size 10M;,它可以正常工作。

我的问题是当我上传一个更大的文件 (15mb) 时,我的 api 没有返回一个带有 laravel 验证错误的 api 响应。在新的elasticbeanstalk中,api响应是nginx的413错误html。在我的 apache(旧 elasticbeanstalk)中,最大文件大小错误显示为来自 laravel 验证的 JSON。

nginx 响应错误

有没有办法绕过默认的 apache 413 html 错误,而是使用 laravel 文件上传最大大小验证?

顺便说一句:我对 nginx 非常不熟悉,所以我仍在尝试了解 nginx 的工作原理。谢谢!

我的 nginx 配置文件:

location / 
    try_files $uri $uri/ /index.php?$query_string;
    gzip_static on;

nginx 的默认 php.conf

root /var/www/html/public;

index index.php index.html index.htm;

location ~ \.(php|phar)(/.*)?$ 
    fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;

    fastcgi_intercept_errors on;
    fastcgi_index  index.php;

    fastcgi_param  QUERY_STRING       $query_string;
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE       $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;

    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param  REQUEST_URI        $request_uri;
    fastcgi_param  DOCUMENT_URI       $document_uri;
    fastcgi_param  DOCUMENT_ROOT      $document_root;
    fastcgi_param  SERVER_PROTOCOL    $server_protocol;
    fastcgi_param  REQUEST_SCHEME     $scheme;
    fastcgi_param  HTTPS              $https if_not_empty;

    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

    fastcgi_param  REMOTE_ADDR        $remote_addr;
    fastcgi_param  REMOTE_PORT        $remote_port;
    fastcgi_param  SERVER_ADDR        $server_addr;
    fastcgi_param  SERVER_PORT        $server_port;
    fastcgi_param  SERVER_NAME        $server_name;

    # PHP only, required if PHP was built with --enable-force-cgi-redirect
    fastcgi_param  REDIRECT_STATUS    200;

    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO $fastcgi_path_info;
    fastcgi_pass   php-fpm;

【问题讨论】:

我认为你必须进一步增加client_max_body_size 才能让 PHP 甚至有机会处理请求。我不知道 laravel,但是这些天 javascript 可以在提交表单之前检查文件的大小,所以最好的选择是在文件上传开始之前显示错误。 嗨@stefansundin 感谢您的回复,我确实增加了我的client_max_body_size,现在它可以工作了!你说的是正确的,该文件已通过 laravel (PHP) 验证 请确保此配置正在部署到所有 eb 实例。我遇到了这样的问题,并通过下面的线程解决了。 ***.com/questions/18908426/… @user3883507 很高兴它解决了您的问题。我将其发布为正确答案,因此您可以接受。谢谢! 【参考方案1】:

您必须进一步增加client_max_body_size 才能让 PHP 有机会接收请求并返回任何类型的错误。

我不知道 laravel,但是现在 JavaScript 可以在提交表单之前检查文件的大小,所以最好的选择是在文件上传开始之前显示错误。

【讨论】:

以上是关于绕过 Elasticbeanstalk 中托管的 api 响应上的 NGINX 413 错误页面的主要内容,如果未能解决你的问题,请参考以下文章

在 Elasticbeanstalk for Scala Apps 中为 Docker 多容器环境部署和托管工件的最佳实践是啥?

在 JPA 上是不是绕过托管实体

看我如何绕过某托管公司域上的强大XSS过滤器

绕过 Chrome 的恶意文件警告

从 Elastic Beanstalk 连接到托管在 AWS ec2 上的 MongoDB

Nodejs中多个端口的ElasticBeanStalk NGinx配置