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/onboard | onboard.fk.com |
dashboard.fk.dev/client/onboard/pages/user | onboard.fk.com/user |
dashboard.fk.dev/client/onboard/pages/company | onboard.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
相关产品推荐
相关产品推荐

