Nginx 代理规则简化

问题描述 投票:0回答:1

背景

[隐藏实际项目名称和网址,因为它是内部项目。]
我们的一组内部公司仪表板部署在内部 URL:

console.fk.dev
。这是一个包含多个仪表板的 next-js 项目。例如

  • Dashboard 1(我们称之为 Onboarding Dashboard)可通过dashboard.fk.dev/client/onboard 访问。
  • Dashboard 2(我们称之为 Analytics Dashboard)可通过dashboard.fk.dev/client/analytics 访问。

问题陈述:

能够设置 nginx 代理,以便可以在 onboard.fk.com 访问 Onboarding Dashboard。

Onboarding Dashboard 目前有两个页面

  • 用户(dashboard.fk.dev/client/onboard/pages/user)
  • 公司(dashboard.fk.dev/client/onboard/pages/company)

(以后会添加更多页面)

仪表板网址 需要在
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

当前解决方案:

我们目前可以通过遵循为 onboard.fk.com 配置的重复 nginx 规则来实现相同的目标

# rule 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";
}
# rule 2
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";
}
# rule 3
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";
}
# rule 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规则?

(我是一名前端开发人员,对 nginx 几乎不了解,试图设置和扩展我的知识)

我尝试使用下面的正则表达式规则,但收到错误:

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 ~ ^/(?: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";
}

有没有一种方法可以通过合并位置块或为重复行创建函数(我们用高级语言(例如 javascript)创建函数的方式)来聚合和简化上述规则。随着项目中添加越来越多的页面,此配置将变得太大且重复,因此需要简化规则。

提前致谢。

nginx proxy nginx-reverse-proxy
1个回答
0
投票
location ~ ^/(?:user|company) {
  rewrite ^/(?:user|company)/(.*) /client/onboard/pages/$1 break;
  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;
} #quotes not necessary && make sure NOT trailing slash for this case

这做出了几个假设,否则从请求的 URI => 结果 URI 执行正确路径的方法将有所不同很大

这不完全是艺术,而是更多的经验,有助于理解在 Nginx 中创建高效且健壮的路由的级联规则集。

尝试上述操作,并记住将会发生什么: 请求的网址:

https://example.com/user/me

代理“接收”此 URL:

https://dashboard.fk.dev/client/onboard/pages/me

为什么? Nginx 无法从 Proxy Pass 指令中的原始位置使用 Regex。使用重写可以解决这个问题。使用break意味着请求不会寻找另一个位置。我假设您想避免在 /user/ 时附加“user”...如果是这种情况并且您想保留 /user 或 /company 那么它必须进行不同的配置...

为了明确起见,/company 的结果与:

https://example.com/company/widgetco/index.htm

代理:

https://dashboard.fk.dev/client/onboard/pages/widgetco/index.htm

如果您需要或可能需要带有 uri 的参数,那么还有另一个配置...请记住,一旦位置规则中的正则表达式或涉及任何类型的重写,那么您就正式超越了“基本”Nginx,并且您的知识库将需要略有增加;)

© www.soinside.com 2019 - 2024. All rights reserved.