我想允许客户端在我们的系统上上传文件,并且我希望他们能够上传大于 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”。