仅对单个 URL 应用 client_max_body_size

仅对单个 URL 应用 client_max_body_size

我想允许客户端在我们的系统上上传文件,并且我希望他们能够上传大于 nginx 中设置的默认文件大小的文件。

因此我在我们的站点配置中设置了以下内容:

client_max_body_size 10m;

到目前为止,一切都很好,但我真的只需要在单个 URL 上增加这个更大的正文尺寸;一个用户POST即可。

因此我尝试了以下配置:

location /api/files/ {
  client_max_body_size 10m;
}

但这根本不起作用,我在日志中收到以下错误:

2016/04/24 13:52:51 [错误] 17853#0:*1569513 客户端打算发送太大的正文:1083334 字节,客户端:203.0.113.7,服务器:example.com,请求:“POST /api/files HTTP/1.1”,主机:“example.com”

因此我尝试了以下改变:

location = /api/files {
  client_max_body_size 10m;
}

但这只会导致不同的错误:

2016/04/24 14:25:50 [错误] 19500#0:*171 open()“/usr/share/nginx/html/api/files”失败(2:没有此文件或目录),客户端:203.0.113.7,服务器:example.com,请求:“POST /api/files HTTP/1.1”,主机:“example.com”

这让我假设location实际上指的是本地文件系统上的位置,尽管文档说:

根据请求 URI 设置配置。

那么,如何仅将此配置更改应用于此单个请求位置?

答案1

我认为解决方案在于嵌套位置。因此“location /api/files”应该是里面您的 php 位置块。您的 fastcgi 配置应继承到“文件”位置。

http://nginx.org/en/docs/http/ngx_http_core_module.html#location

location ~* \.php$ {
     try_files $uri =404;
     fastcgi_pass backend; 
     # [...]

     location /api/files { 
          client_max_body_size 10m;
     }
}

如果您的 php 位置之外有位置 /api/files,nginx 会查找“api/files”并记住它。但在使用它之前,它会检查是否存在具有匹配正则表达式的位置,这将是 php 文件请求的 php 位置。然后它将使用 php 位置并丢弃“location api/files”。

相关内容