[隐藏实际项目名称和网址,因为它是内部项目。]
我们的一组内部公司仪表板部署在内部 URL:
console.fk.dev
。这是一个包含多个仪表板的 next-js 项目。例如
能够设置 nginx 代理,以便可以在 onboard.fk.com 访问 Onboarding Dashboard。
Onboarding Dashboard 目前有两个页面
(以后会添加更多页面)
仪表板网址 | 需要在 |
---|---|
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: [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)创建函数的方式)来聚合和简化上述规则。随着项目中添加越来越多的页面,此配置将变得太大且重复,因此需要简化规则。
提前致谢。
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,并且您的知识库将需要略有增加;)