проблема с использованием переменной в директиве местоположения nginx

#nginx #proxypass

Вопрос:

Добрый вечер. у меня есть вопрос относительно nginx, и он связан с директивой о местоположении. в настоящее время у меня есть эта конфигурация в nginx

 server {  
  server_name ~^(?<account>. ).domain.com$;
  root /var/www/html/folder-frontend/;
  index index.html;

  error_log /var/log/nginx/$account-access.log;
  access_log /var/log/nginx/$account-access.log;

  location / {
      try_files $uri /index.html;
  }

  location /$account-backend/ {
      proxy_pass http://service-backend/;
      proxy_set_header HOST $account-backend.domain.co;
      proxy_http_version 1.1;
  }
}
 

это означает, что у меня есть несколько доменов с окончанием tenant.domain.com(app1.domain.com, app2.domain.com). с помощью выражения (?. ) я получаю часть строки в интересующем меня URL-адресе, а затем в директиве location использую ее для создания прокси-адреса и перенаправления запросов. но это не работает, я знаю, потому что, когда я помещаю в местоположение то, что меня интересует (в данном случае это будет местоположение /app1-серверная часть/), если перенаправляет на серверную службу, которую я прослушиваю в другом nginx.

Я сомневаюсь, могу ли я использовать переменную в директиве location nginx? Я попробовал именно так, как указано, и это не работает.

Ответ №1:

Нет, вы не можете использовать переменную в качестве location аргумента директивы, даже в соответствующих регулярных выражениях. Вы можете попробовать обходной путь, например

 server {  
    server_name ~^(?<account>. ).domain.com$;
    root /var/www/html/folder-frontend/;
    index index.html;

    error_log /var/log/nginx/$account-access.log;
    access_log /var/log/nginx/$account-access.log;

    location / {
        try_files $uri /index.html;
    }

    location ~ ^/(?<prefix>[^.] )-backend(?<suffix>/.*) {
        if ($prefix != $account) {
            return 404;
        }
        proxy_pass http://service-backend$suffix$is_args$args;
        proxy_set_header HOST $prefix-backend.domain.co;
        proxy_http_version 1.1;
    }
}