Перенаправление поддоменов с использованием proxy pass

Всем привет! Не могу разобраться, как правильно настроить работу динамических поддоменов с Nginx.

Представим, что у меня есть огромное кол-во поддоменов, заранее не известны их названия. Фронт работает на Next.js (например на порту 3000). Все запросы, которые поступают на адрес типа abc.domain.com/test необходимо направлять на domain.com/abc/test. В этом примере abc это slug, который является именем поддомена, test это путь, который необходимо обработать. Вот еще некоторые примеры: abc1.domain.com/a/b/c --> domain.com/abc1/a/b/c, abc2.domain.com --> domain.com/abc2 и так далее. Пользователь не должен видеть прямой путь, должен постоянно находиться на поддомене.

Пробовал вот так:

server {
    listen 80;

    server_name ~^(.*)\.domain\.com$;

    location / {
        proxy_pass http://host.docker.internal:3000/;
        proxy_set_header Host $host;
    }
}

Но это работает только для прямых запросов abc.domain.com/ -- открывает domain.com/

Буду рад любым комментариям!


Ответы (1 шт):

Автор решения: Aleksey Vaganov

Можно из поддомена получить первый сегмент, а затем реврайтить на нужный URL.

http {
  # Мапим поддомен и префикс
  map $host $prefix {
    "~^([^.]+)\.domain\.com" /$1;
  }

  server {

    # Добавляем префикс к URL
    rewrite ^(.*)$ $prefix$1 last;

    location / {
      proxy_pass ... ;
    }
  }
}
→ Ссылка