Laravel POST 当 jwilder/nginx-proxy 时大于 8kb/16KB(和 2MB)的文件出现 TokenMismatchException

Laravel POST TokenMismatchException for files bigger than 8kb/16KB (and 2MB) when jwilder/nginx-proxy

我在 Laravel 5.4 中编写应用程序并将其 dockerized。要在我的主机中使用子域,我使用 jwilder/nginx-proxy 反向代理将请求重定向到我的容器。在我的应用程序中允许用户上传文件但是,当我 运行 它在我的主机上并发送 POST "multipart/form-data" 请求大于 8kb 的文件时,然后 laravel return TokenMismatchException。这是我的配置:

在我的 Dockerfile 我使用

FROM php:7.1.5-alpine
...
ADD ./uploads.php.ini /usr/local/etc/php/conf.d/uploads.ini
...
CMD ... && php artisan serve --host=0.0.0.0 --port=80

uploads.php.ini我有:

file_uploads = On
memory_limit = 100M
upload_max_filesize = 200M
post_max_size =500M
max_execution_time = 600

我运行jwilder/nginx-proxy是这样的:

docker pull jwilder/nginx-proxy:alpin
docker run -d -p 80:80 -p 443:443 -v /path/on/host/to/my_proxy.conf:/etc/nginx/conf.d/my_proxy.conf:ro -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy:alpine

my_proxy.conf(对于nginx配置)我有;

server_tokens off;
client_max_body_size 0;

:(

我花了很多时间来测试不同的方法,最后我找到了两个解决方案。文件 my_proxy.conf 应如下所示:

server_tokens off;
client_max_body_size 0;
proxy_request_buffering off;

或者像这样(以文件 <=10MB 为例)

server_tokens off;
client_max_body_size 0;
client_body_buffer_size 10M; 

server_tokens on/off 不是问题解决方案的一部分。

可能的问题是因为 nginx 将 'big' 请求分配给较小的请求并 'proxy' 它们分开(因此 laravel 仅授权 'first' segment/part of 'big'请求但不授权其他部分)。

当然第一个方案更好,因为我们不需要设置任何限制。但是如果有人想对代理设置限制(例如 20MB),那么应该更改 client_max_body_size 20M;.