You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx嵌套正则Location配置异常:匹配失败404问题求助

Nginx配置错误分析与修正

你的配置存在三个核心问题,导致嵌套location无法匹配并返回404:

1. 内层location匹配的URI对象错误

当外层使用正则~ ^/api/warehouse/(.*)$,并通过proxy_pass http://127.0.0.1:3000/$1改写请求URI后,内层location匹配的是改写后的URI(即$1对应的内容),而非原始完整URI。

比如请求/api/warehouse/inventory/,外层处理后URI变为inventory/,但你内层写的^/api/warehouse/inventory/$是匹配原始完整路径,自然无法命中,最终请求落入最后的deny all规则。

2. 兜底正则过于宽泛

最后一个内层location ~ /{会匹配任何包含/的URI(几乎所有请求),由于前面的内层正则无法命中,所有请求都会走到这个规则,直接被拒绝。

3. 未明确内层的转发规则

外层的proxy_pass会被内层继承,但如果内层没有针对自身路径明确转发逻辑,可能导致后端接收的URI不符合预期,同时也容易出现规则冲突。


修正后的配置方案

推荐使用精确匹配location(=前缀)处理已知路径,优先级更高且逻辑清晰:

# 需放在http块中定义限流/连接限制区域
limit_req_zone $binary_remote_addr zone=inventory:10m rate=20r/s;
limit_req_zone $binary_remote_addr zone=pricing:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=warehouseConn:10m;

server {
    # 其他server配置(如listen、server_name等)

    # 外层匹配所有/api/warehouse/开头的请求,设置全局连接限制
    location /api/warehouse/ {
        limit_conn warehouseConn 5;

        # 精确匹配inventory路径,设置独立限流
        location = /api/warehouse/inventory/ {
            limit_req zone=inventory burst=10 nodelay;
            proxy_pass http://127.0.0.1:3000/inventory/;
            # 可添加其他proxy配置,如proxy_set_header等
        }

        # 精确匹配pricing路径,设置独立限流
        location = /api/warehouse/pricing/ {
            limit_req zone=pricing burst=5 nodelay;
            proxy_pass http://127.0.0.1:3000/pricing/;
        }

        # 兜底规则:拒绝所有未匹配的/api/warehouse/下的请求
        location /api/warehouse/ {
            deny all;
        }
    }
}

如果坚持使用正则嵌套,需调整内层正则匹配改写后的URI:

# 全局限流区域定义(同上)

server {
    # 其他server配置

    location ~ ^/api/warehouse/(.*)$ {
        limit_conn warehouseConn 5;

        # 匹配改写后的inventory/路径
        location ~ ^inventory/$ {
            limit_req zone=inventory burst=10 nodelay;
            proxy_pass http://127.0.0.1:3000/$1;
        }

        # 匹配改写后的pricing/路径
        location ~ ^pricing/$ {
            limit_req zone=pricing burst=5 nodelay;
            proxy_pass http://127.0.0.1:3000/$1;
        }

        # 兜底规则:拒绝未匹配的路径
        location ~ .+ {
            deny all;
        }
    }
}

内容的提问来源于stack exchange,提问作者iTaMaR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:10:34