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

Nginx map路由配置问题:含de的URI无法转发至app_b且报错

问题解决:Nginx通过Map实现URI前缀路由转发

错误原因分析

你的配置存在三个核心问题:

  1. 匹配规则不符合需求:原配置用^.*de.*$会匹配任何包含de字符的URI,而非你需要的以de开头的URI;
  2. 变量为空导致URL错误:当请求URI不匹配任何map规则时,$resources_location会为空,拼接后http://$resources_location变成http://,触发invalid URL prefix错误;
  3. 后端地址格式冗余:map值里的结尾/会导致Nginx转发路径时出现不必要的拼接问题。

修正后的配置

# 定义map规则:根据URI匹配对应的后端服务
map $uri $backend {
    # 根路径请求转发到app_a
    "/"          "app_a:1234";
    # 以/de开头的URI转发到app_b
    "^/de.*$"    "app_b:2345";
    # 默认规则:所有未匹配的请求都转发到app_a
    default      "app_a:1234";
}

server {
    listen       80;
    listen  [::]:80;
    server_name  example.com;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        # 转发到map匹配到的后端服务
        proxy_pass http://$backend;
        proxy_redirect off;
    }

    # 静态资源路径同样使用map匹配的后端
    location ~ ^/(assets|public|favicon.ico) {
        proxy_pass http://$backend;
    }
}

关键调整说明

  • 匹配规则修正:用^/de.*$精准匹配以/de开头的URI,完全符合你的需求;
  • 添加默认值:通过default规则确保$backend永远不会为空,彻底解决URL前缀错误;
  • 简化后端地址:去掉map值里的结尾/,Nginx会自动将完整的请求路径转发给后端,避免路径拼接混乱;
  • 可选优化:用$uri代替$request_uri做匹配,$uri仅包含请求路径(不含查询参数),匹配逻辑更精准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:30:59