Nginx中在/api/ location内为特定路由配置client_max_body_size报错求助
解决Nginx在location内为特定路由配置client_max_body_size的问题
报错原因:client_max_body_size是http、server、location级别的配置指令,不能放在if块中,这是Nginx的指令上下文限制导致的。
下面提供两种可行的解决方案:
方案一:拆分location块(推荐)
利用Nginx的location匹配优先级,先定义匹配特定路由的location块,再定义通用的/api/路由块:
# 匹配/api/a、/api/b、/api/e开头的路由 location ~* ^/api/(a|b|e) { proxy_pass http://nest:3500; include nginxconfig.io/proxy.conf; client_max_body_size 50m; } # 匹配其他/api/下的路由 location /api/ { proxy_pass http://nest:3500; include nginxconfig.io/proxy.conf; # 可设置默认的请求体大小,比如默认1m client_max_body_size 1m; }
Nginx会优先匹配更精确的正则location,所以特定路由会走第一个块,使用50m的大小限制,其余/api/路由走第二个块的默认配置。
方案二:使用map指令映射变量
如果不想拆分location,可以在http块(或server块的上层上下文)定义map,根据请求URI映射对应的body大小,再在location中引用:
- 在http块中添加map配置:
map $request_uri $custom_body_size { ~* ^/api/(a|b|e) 50m; default 1m; # 默认请求体大小 }
- 在/api/的location块中使用变量:
location /api/ { proxy_pass http://nest:3500; include nginxconfig.io/proxy.conf; client_max_body_size $custom_body_size; }
注意:该方案要求Nginx版本≥1.13.9,因为从这个版本开始client_max_body_size才支持使用变量。
内容的提问来源于stack exchange,提问作者SexyMF
相关产品推荐
相关产品推荐

