为什么使用content_by_lua_block允许nginx位置指令通过?

时间:2019-10-17 22:07:51

标签: nginx lua openresty

我正在将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;
}

现在

  1. 仅允许/path/for/file/uploads较大的身材
  2. 与该路径匹配的请求也会“传递”到其余内容和proxy_pass

它可以满足我的要求,但是为什么?调用使其通过的content_by_lua_block指令有什么特别之处?如何在没有content_by_lua_block的情况下在香草nginx中通过它?

请注意,如果我将其分成两个独立的非嵌套位置指令,它仍然可以正常工作。

0 个答案:

没有答案