Назад | Перейти на главную страницу

nginx динамическое имя сервера с регулярным выражением не работает для co.uk

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

server_name ((?<subdomain>.+)\.)?(?<domain>.+)\.(?<tld>.*);

Это создаст 3 переменные, которые nginx будет использовать позже, например, при использовании следующего URL: test.foo.example.com это будет оценивать:

  1. $ subdomain = test.foo
  2. $ domain = пример
  3. $ tld = com

Проблема возникает при использовании домена верхнего уровня co.uk. В этом случае при использовании URL test.foo.example.co.ukон будет оценивать:

  1. $ subdomain = test.foo.cedira
  2. $ domain = co
  3. $ tld = uk

Как мне отредактировать регулярное выражение, чтобы оно работало и на co.uk?

Это может проверить часть www, а также получить только первый захват как второй захват поддомена как домен, а остальное как хост-домен:

server_name ~^(www\.)?((?<subdomain>.+?)\.)?((?<domain>.+?)\.)?(?<host_domain>.+)\.(?<tld>co.uk)$ ~^(www\.)?((?<subdomain>.+?)\.)?((?<domain>.+?)\.)?(?<host_domain>.+)\.(?<tld>.*)$;

Я обнаружил, что можно определить несколько server_names, поэтому я просто сделал два регулярных выражения в качестве server_name, если первое не сработает, оно автоматически перейдет ко второму.

server_name ~^((?<subdomain>.+)\.)?(?<domain>.+)\.(?<tld>co.uk)$ ~^((?<subdomain>.+)\.)?(?<domain>.+)\.(?<tld>.*)$;

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