NGINX - 将某些路由重定向到子域

NGINX - Redirecting certain routes to a subdomain

我创建了一个项目,我有:

  1. my-project.com 展示我的 Angular 8 App
  2. api.my-project.com 访问我的 Symfony 5 API

我在我的 Angular 应用程序上构建了一个非常基本的登录页面,但现在我改变了主意,我想将我的 angular 应用程序放入 app.my-project.com 并保留 my-project.com 展示一个漂亮的着陆页。

问题是有些客户端已经在使用主域上的服务,该请求应该重定向到 app.my-project.com 子域。

应该是这样的:

my-project.com/login -> app.my-project.com/login

my-project.com/pm-something -> app.my-project.com/pm-something

这是我需要的伪代码:

if( url.includes('login') or url.includes('pm-') ) {
    redirectTo(app.my-project.com)
}

我认为最简单的方法是重写我的 NGINX 配置文件中的路由,但我不确定正确的方法。

提前致谢。

NGINX 根据服务器配置中定义的 location 块选择请求 URI 处理规则。关于这个指令的官方文档是 here, and here 是一些额外的解释。您可以使用两个前缀位置实现所需的行为:

location /login {
    return 301 $scheme://app.my-project.com$request_uri;
}
location /pm- {
    return 301 $scheme://app.my-project.com$request_uri;
}

这两个前缀位置可以替换为单个正则表达式匹配位置:

location ~ ^/(login|pm-) {
    return 301 $scheme://app.my-project.com$request_uri;
}

NGINX 使用系统 PCRE 库和通用 PCRE 正则表达式语法,除了你不应该为正则表达式模式使用分隔符(匹配使用 ~(区分大小写的匹配)指定的正则表达式,~*(不区分大小写的匹配)或 !~/!~*(case-sensitive/case-insensitive 非匹配)运算符)。此外,您不需要在 / 字符前加上反斜杠(尽管您仍然可以这样做,但它不会改变正则表达式模式的含义)。