NGINX:如何根据内容类型使用不同的指令和规则处理一个位置?

v2g6jxz6  于 2023-10-17  发布在  Nginx
关注(0)|答案(1)|浏览(117)

有没有一种方法,而不是解决办法,来处理一个location ~* <ADDRESS> {},但根据content-type使用不同的proxy_request_buffering值(开/关)?例如,如果multipart/form-data,则proxy_request_buffering必须是off,而对于其他请求,则必须是on。这些类型的指令不能通过变量或IF条件动态设置。因此,它应该是类似于一个location作为入口点,将请求转发到其他sub-locations。但如何才能做到这一点?请帮帮我
它是特定于应用程序的东西,一个请求类型可以用于多种用途。这就是为什么我不能把它们分开。关于POST主体中存储的类型的信息。OR内容类型也是解耦它们的好标志。
代码示例:

location ~* /application/service$ {
        client_max_body_size '5000m';
        client_body_buffer_size '1m';

        proxy_request_buffering on;
        proxy_buffering on;

        rewrite_by_lua_file /etc/nginx/lua/service.lua;
        
        include /etc/nginx/conf.d/common/reverse.conf;
        proxy_pass $proxy_address;
    }

目标是能够基于content-type设置方向词client_max_body_sizeproxy_request_buffering

Client -bigfile----*       *--> sub-location (buffering is off)
                    \     /
                   location
                    /     \
Client -regular----*       *--> sub-location (buffering is on)
knsnq2tg

knsnq2tg1#

处理一个位置~* {},但根据内容类型使用不同的proxy_request_buffering(on/off)值
我也遇到了同样的问题。我认为解决这个问题最简单的方法是使用nginx内部重定向机制。代码示例:

location @multi_part {
    internal;
    proxy_buffering off;
    proxy_pass http://localserve;
}

location /kodo_test {
    rewrite_by_lua_block{
        if ngx.var.http_content_type == "multipart/form-data" then 
            return ngx.exec("@multi_part", nil)
        end 
    }
    proxy_buffering on;
    proxy_pass http://localserve;
}

相关问题