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

Nginx代理规则简化咨询:内部仪表盘域名映射优化

Nginx代理规则简化方案

背景

[内部项目,已隐藏真实名称与URL]
公司内部仪表盘部署在console.fk.dev,是包含多仪表盘的Next.js项目:

  • 入职仪表盘(Onboarding Dashboard):访问地址dashboard.fk.dev/client/onboard
  • 分析仪表盘(Analytics Dashboard):访问地址dashboard.fk.dev/client/analytics

问题说明

需要配置Nginx代理,让入职仪表盘可以通过onboard.fk.com访问。目前该仪表盘包含两个页面,未来会新增更多:

  • user页面:dashboard.fk.dev/client/onboard/pages/user
  • company页面:dashboard.fk.dev/client/onboard/pages/company

域名映射需求如下:

原仪表盘URL目标访问地址
dashboard.fk.dev/client/onboardonboard.fk.com
dashboard.fk.dev/client/onboard/pages/useronboard.fk.com/user
dashboard.fk.dev/client/onboard/pages/companyonboard.fk.com/company

当前冗余配置

现在用重复的Nginx规则实现需求,规则冗余严重,新增页面就得加新规则:

# 规则1:根路径
location = / {
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Console-Basename "/";
    proxy_set_header X-Request-Uri $request_uri;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass "https://dashboard.fk.dev/client/onboard/pages";
}
# 规则2:user页面
location /user {
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Console-Basename "/";
    proxy_set_header X-Request-Uri $request_uri;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass "https://dashboard.fk.dev/client/onboard/pages";
}
# 规则3:company页面
location /company {
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Console-Basename "/";
    proxy_set_header X-Request-Uri $request_uri;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass "https://dashboard.fk.dev/client/onboard/pages";
}
# 规则4:其他路径
location / {
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Request-Uri $request_uri;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass "https://dashboard.fk.dev";
}

尝试中的问题

作为前端开发者,对Nginx了解不多,想简化规则避免未来新增页面时冗余。尝试用正则location规则时触发错误:

location ~ ^/(?:user|company) {
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Console-Basename "/";
    proxy_set_header X-Request-Uri $request_uri;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass "https://dashboard.fk.dev/client/onboard/pages";
}

错误信息:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /opt/homebrew/etc/nginx/nginx.conf:142

简化方案

核心思路

解决正则location的proxy_pass错误,同时复用重复的代理头配置,避免规则冗余。

方案1:正则匹配+路径重写

把重复的代理头提到server块共享,用rewrite处理路径映射,未来新增页面只需在正则里加关键词:

server {
    server_name onboard.fk.com;

    # 所有location共享的代理头,不用重复写
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Request-Uri $request_uri;
    proxy_set_header X-Forwarded-Proto $scheme;

    # 匹配根路径、/user、/company,未来加页面直接在括号里加,比如(user|company|team)
    location ~ ^/(user|company)?$ {
        proxy_set_header X-Console-Basename "/";
        # 正则location不能直接在proxy_pass后加URI,用rewrite把请求路径转成目标路径
        rewrite ^/(.*)$ /client/onboard/pages/$1 break;
        proxy_pass https://dashboard.fk.dev;
    }

    # 处理其他非入职仪表盘的路径
    location / {
        proxy_pass https://dashboard.fk.dev;
    }
}

方案2:前缀匹配+根路径单独处理

如果不想用正则,用前缀匹配配合^~提高优先级,同样能实现复用:

server {
    server_name onboard.fk.com;

    # 共享代理头
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Request-Uri $request_uri;
    proxy_set_header X-Forwarded-Proto $scheme;

    # 根路径单独匹配,优先级最高
    location = / {
        proxy_set_header X-Console-Basename "/";
        proxy_pass https://dashboard.fk.dev/client/onboard/pages/;
    }

    # 匹配所有入职仪表盘的页面路径,新增页面无需改规则
    location ^~ / {
        proxy_set_header X-Console-Basename "/";
        rewrite ^/(.*)$ /client/onboard/pages/$1 break;
        proxy_pass https://dashboard.fk.dev;
    }

    # 若有其他非入职仪表盘的路径需要代理,再单独添加location规则
}

关键说明

  • 正则location里不能在proxy_pass后带URI路径,所以必须用rewrite把请求路径转换成目标后端路径
  • 把重复的proxy_set_header放到server块,所有子location都会继承,减少冗余
  • 方案1的正则可以灵活扩展,新增页面只需在括号内添加新的路径关键词

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:20:09