Nginx 正则表达式在位置块中?

Nginx 正则表达式在位置块中?

因此,我使用 Nginx 作为反向代理,并且我当前的配置已经变得非常长,因为我有大约 12 个子域,并且这个数字还会继续增长。我正在寻找一种方法来清理我的配置,我想我找到了一种方法,但我无法让它工作。以下是我正在尝试的:

server {
  server_name  ~^(.+)\.domain\.com$;
  ssl  on;

  location ~ domain1 {
    proxy_pass  http://192.168.1.50:4040/;
  }

  location ~ domain2 {
    proxy_pass  http://192.168.1.60:4040/;
  }
}

但它给了我一个错误,说

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"

我明白它在说什么,但不确定如何解决它。如果我从指令中删除尾部斜杠proxy_pass,Nginx 将启动而不会出现错误,但两个子域都不起作用。

我这样做对吗? 有没有更好的方法?

提前致谢!

答案1

正如评论中提到的,最好的方法(最易读和最快)是手动配置每个域。这是因为 NGINX 会在内存中创建静态实体,以避免每个请求的运行时处理。

但是,如果您确实想这样做(将 proxy_pass 传递到不同子域的不同位置),那么您可以这样做:

例如

map $http_host $my_upstream {
    default http://192.168.1.1:8080;
    domain1.* http://172.0.0.1:8081;
    domain2.* http://10.0.0.1:80802;
}

server {
    server_name ~(.+)\.domain\.com;

    location / {
        proxy_pass $my_upstream;
    }
}

请注意,map需要外部服务器块

相关内容