我正在将openresty/1.15.8.2
用作有时需要接受大型文件的应用程序前面的代理。
我想有条件地设置client_max_body_size 200M
,因此只有期望文件的URL可以接受较大的正文。我尝试的第一件事是将url检查放入if语句中,例如:
if ($url ~ /path/to/file/upload) {
content_max_body_size 200M;
}
这不起作用,因为nginx表示此处不允许使用“ content_max_body_size”指令。
我接下来尝试的是一个嵌套的位置块,如下所示:
location ~ ^(mypatterns)$ {
# do stuff
location ~ ^/path/for/file/upload$ {
client_max_body_size 200M;
}
# do stuff
proxy_pass whatever;
}
但这不起作用。我收到类似这样的错误:
*14941 open() "/.../path/for/file/upload" failed (2: No such file or directory), ...
这意味着嵌套位置尝试查找要提供服务的文件,而不是传递到外部位置块的其余部分。
但是,如果我在嵌套位置设置了一个空的content_by_lua_block {}
指令,它将很好地工作:
location ~ ^(mypatterns)$ {
# do stuff
location ~ ^/path/for/file/upload$ {
client_max_body_size 200M;
content_by_lua_block {}
}
# do stuff
proxy_pass whatever;
}
现在
/path/for/file/uploads
较大的身材proxy_pass
它可以满足我的要求,但是为什么?调用使其通过的content_by_lua_block
指令有什么特别之处?如何在没有content_by_lua_block
的情况下在香草nginx中通过它?
请注意,如果我将其分成两个独立的非嵌套位置指令,它仍然可以正常工作。