Laravel POST TokenMismatchException 适用于大于 8kb/16KB(和 2MB)的文件



我在Laravel 5.4中编写应用程序并将其docker化。为了在我的主机中使用子域jwilder/nginx-proxy我使用反向代理将请求重定向到我的容器。在我的应用程序中允许用户上传文件,但是,当我在我的主机上运行它并为大于 8kb 的文件发送 POST "多部分/表单数据"请求时,然后 laravel 返回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将"大"请求划分为较小的请求并单独"代理"它们(因此laravel仅授权"大"请求的"第一"段/部分,而不授权其他部分(。

当然,首先提出的解决方案更好,因为我们不需要设置任何限制。但是,如果有人想在代理中设置限制(例如 20MB(,那么应该更改client_max_body_size 20M;.

最新更新